在C#中,代码可以组织为多个项目。假设我有两个项目ProjectA和ProjectB。我可以设置ProjectB来引用ProjectA。完成后,ProjectB中的类可以使用ProjectA中定义的类。但是ProjectA中的类不能使用ProjectB中定义的类,并且也不能使ProjectA引用ProjectB。
python中有与此等效的东西吗?我认为python中的软件包非常类似于C#中的项目。似乎没有什么能阻止python中软件包之间的循环依赖。我可以在PackageA的PackageB参考模块中包含模块,同时在PakcageB的PackageA参考模块中包含模块。这会很快演变成软件包之间的依赖关系的混乱网络。
python中是否有构造或工具来防止循环依赖性,就像项目在c#中所做的那样?
答案 0 :(得分:0)
Python允许循环依赖,但是很少有用。
虽然通常来说,两个相互依赖的程序包不被视为循环依赖项,而仅被视为两个模块。例如
from moduleA import B
class C:
# definition
B.start()
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
,也不会对其进行检查。