循环依赖C#项目与Python软件包

时间:2018-10-24 02:13:14

标签: c# python package circular-dependency

在C#中,代码可以组织为多个项目。假设我有两个项目ProjectA和ProjectB。我可以设置ProjectB来引用ProjectA。完成后,ProjectB中的类可以使用ProjectA中定义的类。但是ProjectA中的类不能使用ProjectB中定义的类,并且也不能使ProjectA引用ProjectB。

python中有与此等效的东西吗?我认为python中的软件包非常类似于C#中的项目。似乎没有什么能阻止python中软件包之间的循环依赖。我可以在PackageA的PackageB参考模块中包含模块,同时在PakcageB的PackageA参考模块中包含模块。这会很快演变成软件包之间的依赖关系的混乱网络。

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

2 个答案:

答案 0 :(得分:0)

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导入,则允许这样做。

答案 1 :(得分:0)

答案是否定的:软件包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成为对 incomplete {{1 }}(没有A),但这没关系,直到调用go为止。创建不完整的引用时不会通知use,也不会对其进行检查。