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

时间:2017-02-16 12:40:46

标签: python python-2.7 circular-dependency

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

以下是我认为显示循环导入问题的错误:

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

我有什么方法可以解决这个问题?

有些人说循环进口是不好的做法,我不明白为什么会出现这种情况,但我想了解原因。他们还建议重构代码,但我想知道如何准确地执行此操作,而不会结束包含所有相互依赖的类的一个巨大文件。

(请注意,我在谷歌应用引擎上使用Python 2.7)

2 个答案:

答案 0 :(得分:1)

上面的评论代表,如果你真的,真的必须这样做(你没有!)你总是可以在AuthorSchema中使用延迟导入:

def get_publication_schema():
    from publication_schema import PublicationSchema
    return PublicationSchema

class AuthorSchema(graphene.ObjectType):

    publications = graphene.List(get_publication_schema)

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

答案 1 :(得分:0)

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

标准OOP方法是针对AuthorInterface,发布导入和作者实现。请参阅非循环依赖原则依赖性反转原则