我有两个相互依赖的类(GraphQL类型定义)。我想把它们移到单独的文件中。在
只要它们定义在同一个文件中,就没有问题。在
# all_schemas.py
class AuthorSchema(graphene.ObjectType):
publications = graphene.List(lambda: PublicationSchema)
class PublicationSchema(graphene.ObjectType):
author = graphene.Field(AuthorSchema)
当我把它们放到不同的文件中时,我就遇到了“循环导入”问题。在
作者_架构.py在
^{pr2}$出版_架构.py在
from author_schema import AuthorSchema
class PublicationSchema(graphene.ObjectType):
author = graphene.Field(AuthorSchema)
以下是我认为显示循环导入问题的错误:
from author_schema import AuthorSchema
File "models/author_schema.py", line 1, in <module>
from publication_schema import PublicationSchema
File "models/publication_schema.py", line 2, in <module>
from author_schema import AuthorSchema
ImportError: cannot import name AuthorSchema
解决这个问题我有什么选择?
有人说循环进口是不好的做法,我不明白为什么会出现这种情况,但我想知道为什么。他们还建议重构代码,但我想知道如何做到这一点,而不是最终得到一个包含所有相互依赖的类的巨大文件。在
(请注意,我使用的是googleappengine上的python2.7)
上面的评论站着,如果你真的,真的必须这么做(你不需要!)您始终可以在
AuthorSchema
中使用延迟导入:警告-您仍然无法执行从
autor_schema.py
的“全局”空间调用PublicationSchema
的任何代码,因为这两个文件都需要完全加载才能相互引用。但在第三方使用场景中,这是可行的。在避免循环依赖的标准python技巧是避免它们在导入时运行。而不是放。例如,将
from author_schema import AuthorSchema
放在PublicationSchema
类中,这样它在从AuthorSchema
导入该类时不会运行。但是,这是不稳定的,确切的放置点取决于代码,并且可能会随着代码的更改而更改。在标准的OOP方法是针对一个
AuthorInterface
,该出版物导入并由作者实现。参见非循环依赖原理和依赖反转原理。在相关问题 更多 >
编程相关推荐