在Python中避免循环(循环)导入?

Dex*_*ter 7 python python-2.7

一种方法是使用import x,而不使用"from"关键字.那么你随处可见它们的命名空间.

还有其他方法吗?喜欢做类似于C++ ifnotdef __b__ def __b__类型的东西?

Fre*_*Foo 10

将任何彼此依赖的模块合并到一个模块中.然后引入额外的模块来获取旧名称.

例如,

# a.py
from b import B

class A: whatever

# b.py
from a import A

class B: whatever
Run Code Online (Sandbox Code Playgroud)

# common.py
class A: whatever
class B: whatever

# a.py
from common import A

# b.py
from common import B
Run Code Online (Sandbox Code Playgroud)

  • 这迫使人们开始在`common.py`而不是`a.py`和`b.py`中声明所有内容.恕我直言,这不是一个好的解 (24认同)

Edw*_*per 5

循环导入是一种"代码气味",并且通常(但并非总是)表明某些重构是合适的.例如,如果A.x使用B.yB.y使用A.z,那么您可以考虑A.z进入自己的模块.

如果你认为你需要循环导入,那么我通常建议导入模块并引用具有完全限定名称的对象(即,import A使用A.x而不是from A import x).

  • 如果正在做一些显式类型检查怎么办?我现在正在尝试这样做,所以我可以提供非常详细的错误消息,而不是一些我的客户不理解的混淆回溯。 (2认同)