在C#中,代码可以组织到多个项目中。 假设我有两个项目 A 和项目 B。 我可以设置项目 B 来引用项目 A。完成此操作后,Project B 中的类可以使用 Project A 中定义的类。 但是项目 A 中的类不能使用项目 B 中定义的类,并且也不能使项目 A 引用项目 B。
在python中是否有与此等价的等价物? 我认为 python 中的包与 C# 中的项目非常等同。 不过,似乎没有什么可以阻止 python 中包之间的循环依赖关系。 我可以在包 A 中拥有包 B 中的模块参考模块,同时在包 A 中拥有包 A 中的模块 在 PakcageB 中引用模块。 这可能会很快演变成包之间混乱的依赖关系网络。
python 中是否有构造或工具来防止循环依赖,就像项目在 c# 中所做的那样?
Python 允许循环依赖,但很少有用。
一般来说,两个相互依赖的包不被视为循环依赖,只有两个模块。前任
moduleB.py
from moduleA import B
class C:
# definition
B.start()
moduleA.py
from moduleB import C
class B:
@staticmethod
def start():
# remaining definitions
d = C()
但是,像这里提到的循环依赖是行不通的——默认的导入机制不允许它,你会得到一个错误,或者导入会一直互相调用,直到你遇到堆栈溢出,除非你实现导入钩子来解决它。
如果 packageA.moduleA 从 packageB.moduleA 导入某些内容,而 packageB.moduleB 从 packageA.moduleA 导入内容,这是允许的。
答案是否定的:包A
无法检测到它所依赖B
的另一个包再次导入了A
。 这是因为如果目标已导入到其他位置,则import
不会执行任何代码。
# A/__init__.py
from B import foo
def go(): return foo.real()
# B/foo.py
import A
def use(): return A.go()
def real(): return 42
这是模块之间的直接循环,而不仅仅是包,它仍然有效:如果首先导入A
,B.foo.A
成为对不完整A
的引用(没有go
(,但这在调用use
之前无关紧要。 创建该不完整的引用时没有向A
发出任何通知或检查。