У меня есть 2 класса (определения типа GraphQL), которые зависят друг от друга. Я хотел бы переместить их в отдельные файлы.Взаимозависимые классы в отдельных файлах (круговой импорт)
Если они определены в одном файле, никаких проблем.
# all_schemas.py
class AuthorSchema(graphene.ObjectType):
publications = graphene.List(lambda: PublicationSchema)
class PublicationSchema(graphene.ObjectType):
author = graphene.Field(AuthorSchema)
Как только я помещаю их в отдельные файлы, я сталкиваюсь с проблемой «циклического импорта».
author_schema.py
from publication_schema import PublicationSchema
class AuthorSchema(graphene.ObjectType):
publications = graphene.List(lambda: PublicationSchema)
publication_schema.py
from author_schema import AuthorSchema
class PublicationSchema(graphene.ObjectType):
author = graphene.Field(AuthorSchema)
Вот то, что ошибка, которую я считаю, чтобы показать круговой вопрос импорта:
Каковы мои варианты для решения этой проблемы?
Некоторые люди говорили, что круговой импорт - это плохая практика, я не понимаю, почему это было бы здесь, но я хотел бы узнать почему. Они также предлагают реорганизовать код, но мне интересно, как это сделать точно, не заканчивая одним огромным файлом, который содержит все взаимозависимые классы.
(Обратите внимание, что я использую Python 2.7, на Google App Engine)
Это плохая практика, потому что в вашем случае невозможно создать структуру класса 'PublicationSchema', не зная, что означает' AutorSchema' (атрибут 'PublicationSchema'' author' зависит от автора), но вы не можете создать ' AutorSchema', в первую очередь потому, что атрибут 'публикаций' зависит от' PublicationSchema'. Это делает всю структуру нелогичной, и интерпретатор Python не может понять, чего вы хотите достичь. – zwer
спасибо @zwer, что я не понимаю, так это: логическая концепция работает нормально, пока все определено в том же файле. Единственное, что я пытаюсь сделать, это переустановить код, а (рабочая) логика останется точно такой же ... – Hoff
Он застревает в импорте, потому что это первая команда, поэтому интерпретатор пытается загрузить любой модуль, который вы ему даете. При использовании двух взаимосвязанных зависимостей, когда он пытается загрузить зависимость, она возвращается к файлу, из которого он пришел, из-за чего он не анализирует второй файл (чтобы избежать бесконечного цикла) и, таким образом, не загружает зависимости. Когда классы находятся в одном файле, Python может разрешить циклическую зависимость, поскольку сначала создает указатели на сами классы, а не пытается сначала загрузить их. – zwer