【问题标题】:Python circular imports in class attributes类属性中的 Python 循环导入
【发布时间】:2019-05-13 23:08:13
【问题描述】:

我有以下文件:

user.py

...
from models.company import Company

class User(BaseModel):
    company = ForeignKeyField(Company, ...)
...

公司.py

...
from models.user import User

class Company(BaseModel):
    user = ForeignKeyField(User, ...)
...

就 python 而言,这是一个正常的循环导入错误。问题是通常的解决方法(将导入语句放在文件末尾,以不同方式导入等)在这种情况下不起作用,因为我在类属性的定义中使用了一个类另一类的。

在这种情况下解决循环导入错误的正确方法是什么?

【问题讨论】:

  • 你能把它们放在 1 个文件中并且根本不导入吗?
  • 嗯,我有很多情况会发生这种情况。这将是一个巨大的“模型”文件。我认为这不是一个好的选择
  • 您可以创建一个空类,然后导入并重新实例化该类,但我很确定您不需要做这种事情
  • @PatrickHaugh 你是对的,有一个DeferredForeignKey 就是为此而定义的。谢谢你的建议!
  • 一旦你有了一个可行的解决方案,你应该考虑为你自己的问题写一个答案,这样其他有这个问题的人就会知道该怎么做。

标签: python python-3.x dependency-injection circular-dependency peewee


【解决方案1】:

事实证明,正如@PatrickHaugh 指出的那样,这实际上是不可能

请注意,您不能在编写它们时在同一个文件中定义它们。当您执行第一个定义时,它将失败,因为尚未定义另一个类的名称,无论您先定义哪个。 ForeignKeyField 来自什么框架?它可能有规避这种情况的工具。

由于我使用 peewee 作为我的 ORM,因此为此构建了一个特殊字段:DeferredForeignKey

所以,归根结底,解决方案是:

user.py

...
from models.company import Company

class User(BaseModel):
    company = ForeignKeyField(Company, ...)
...

公司.py

...
class Company(BaseModel):
    user = DeferredForeignKey('User', ...)
...

【讨论】:

  • 请注意,循环外键在 peewee 文档中被视为“异味”,不鼓励使用。
猜你喜欢
  • 2010-10-19
  • 2019-02-24
  • 1970-01-01
  • 1970-01-01
  • 2012-10-13
  • 2014-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多