循环依赖C#项目与Python包

2024-04-24 14:50:42 发布

您现在位置:Python中文网/ 问答频道 /正文

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

在python中是否有与此等价的东西?我认为python中的包相当于C#中的项目。但似乎没有什么可以阻止python中包之间的循环依赖关系。我可以在PackageB中有模块参考PackageA中的模块,同时在PackageA中有模块参考PackageB中的模块。这会很快演变成一个由包之间的依赖关系组成的混乱网络。你知道吗

python中是否有构造或工具可以像c#中的项目那样防止循环依赖?你知道吗


Tags: 模块工具项目代码网络定义关系等价
2条回答

Python允许循环依赖,但很少有用。你知道吗

不过,一般来说,相互依赖的两个包不被认为是循环依赖,只有两个模块。前

你知道吗模块b.py你知道吗

from moduleA import B

class C:
    # definition
B.start()

你知道吗模数a.py你知道吗

from moduleB import C

class B:
    @staticmethod
    def start():
# remaining definitions
d = C()

但是,像这里提到的循环依赖项是行不通的,默认的导入机制不允许这样做,并且您会得到一个错误,或者导入会一直互相调用,直到您遇到堆栈溢出,除非您实现导入钩子来解决它。你知道吗

如果模块包装从…进口某物包装B.moduleA,和组件B.moduleB进口自模块包装,这是允许的。你知道吗

答案是否定的:一个包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之前并不重要。不完整的引用是在没有任何通知或检查的情况下创建的。你知道吗

相关问题 更多 >