组织__init__.py文件

时间:2016-03-04 19:34:23

标签: python django import

我正在将一系列python文件放入他们自己的模块中。因此我将它们放在目录中并添加了一个init文件。

为了让我按以下方式访问它们

from module import subclass

而不是

from module.submodule import subclass

我正在尝试将我要公开的所有类导入到 init 文件中。但是,由于许多子模块相互引用(它是一个Django项目,因此所有类都是彼此的外键)当我运行代码时,我很快就会进入循环导入。

是否有正确的方法来组织 init .py文件以避免这种情况?

例如:

  File "/Users/.../models/__init__.py", line 4, in <module>
from Guests import Guest
  File "/Users/.../models/Guests.py", line 5, in <module>
from Logs import LogEntry
  File "/Users/..../models/Logs.py", line 6, in <module>
from Staff import Staff
  File "/Users/.../Staff.py", line 5, in <module>
from Properties... import Site
  File "/Users/./Properties.py", line 7, in <module>
from Guests import Guest
ImportError: cannot import name Guest

1 个答案:

答案 0 :(得分:1)

如果A依赖于X而X依赖于A可能他们认为生活在同一单元内,那么检查并将循环依赖关系拆分为同一模块然后寻找解决方法会更好。

不推荐但是,如果您无法调整包的结构,可以将循环导入移动到功能定义中或遵循该原则(我不知道您的代码......)。 / p>

如果A.py类依赖于B.py而B.py取决于A.py:

# B.py
class B:

  def __init__(self):
        import A 
        A.some_method()

更新:正如评论所指出的那样,Django外键变量导致循环导入以避免该问题删除类的导入并将模型名称用作字符串。

item = models.ForeignKey('class_file.Item')