首页 > 解决方案 > 循环依赖 C# 项目与 Python 包

问题描述

在 C# 中,代码可以组织成多个项目。假设我有两个项目 ProjectA 和 ProjectB。我可以设置 ProjectB 来引用 ProjectA。一旦我这样做了,ProjectB 中的类就可以使用 ProjectA 中定义的类。但是ProjectA中的类不能使用ProjectB中定义的类,也不能使ProjectA引用ProjectB。

在 python 中是否有任何等价物?我认为 python 中的包与 C# 中的项目非常等价。不过,似乎没有什么能阻止 python 中包之间的循环依赖。我可以在 PackageA 中的 PackageB 中引用模块,同时在 PakcageB 中的 PackageA 中引用模块。这很快就会演变成一个包之间依赖关系的混乱网络。

python中是否有构造或工具来防止循环依赖,就像项目在c#中所做的那样?

标签: c#pythonpackagecircular-dependency

解决方案


答案是否定的:一个包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


推荐阅读