循环依赖 C# 项目与 Python 包



在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

这是模块之间的直接循环,而不仅仅是包,它仍然有效:如果首先导入AB.foo.A成为对不完整A的引用(没有go(,但这在调用use之前无关紧要。 创建该不完整的引用时没有向A发出任何通知或检查。

相关内容

  • 没有找到相关文章

最新更新