我有兩個相互依賴的類(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,在谷歌應用程序引擎)
這是一個不好的做法,因爲在你的情況下,如果不知道'AutorSchema'是什麼('PublicationSchema'類屬性'author'依賴於它),你無法創建'PublicationSchema'類結構,但是你不能創建'首先是「AutorSchema」,因爲它的'publications'屬性依賴於'PublicationSchema'。這使得整個結構不合邏輯,Python解釋器無法知道你想實現什麼。 – zwer
感謝@zwer,我不明白的是:只要一切都在同一個文件中定義,邏輯概念就可以正常工作。我試圖做的事情是重新組織代碼,而(工作)邏輯保持完全一樣...... – Hoff
它被卡在導入上,因爲這是第一個命令,所以解釋器試圖加載你先給它的任何模塊。有了兩個相互關聯的依賴關係,當它嘗試加載依賴關係時,它將被拋回到它所來自的文件中,導致它不會解析第二個文件(以避免無限循環),從而無法加載依賴關係。當類在同一個文件中時,Python能夠解析循環依賴,因爲它首先創建指向類的指針,而不是先嚐試加載它們。 – zwer