独立文件中相互依赖的类(循环导入)

2024-03-29 10:33:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个相互依赖的类(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)


Tags: 文件frompyimportfieldmodels架构schema
2条回答

上面的评论站着,如果你真的,真的必须这么做(你不需要!)您始终可以在AuthorSchema中使用延迟导入:

def get_publication_schema():
    from publication_schema import PublicationSchema
    return PublicationSchema

class AuthorSchema(graphene.ObjectType):

    publications = graphene.List(get_publication_schema)

警告-您仍然无法执行从autor_schema.py的“全局”空间调用PublicationSchema的任何代码,因为这两个文件都需要完全加载才能相互引用。但在第三方使用场景中,这是可行的。在

避免循环依赖的标准python技巧是避免它们在导入时运行。而不是放。例如,将from author_schema import AuthorSchema放在PublicationSchema类中,这样它在从AuthorSchema导入该类时不会运行。但是,这是不稳定的,确切的放置点取决于代码,并且可能会随着代码的更改而更改。在

标准的OOP方法是针对一个AuthorInterface,该出版物导入并由作者实现。参见非循环依赖原理和依赖反转原理。在

相关问题 更多 >