Python circular dependencies
我们为一个新项目选择了Python,因为我们希望使用一种语言,在这种语言中我们可以以非冗长的方式编写漂亮的代码。
我们以前编写代码的顾问提供了一个很好的工作解决方案。但是当我们看代码时,它充满了函数local from X import Y。我们立即将导入内容移到了文件的顶部,但现在受到循环依赖的攻击。我们绝对不希望解决循环依赖关系,也不希望将导入移回函数,这非常冗长。
问题1:我们如何解决这个问题?
问题2:什么是循环依赖性无意义?当其他语言似乎已经很好地解决了这个问题时,Python社区如何能够接受这个问题?(我希望这不是某种特征)
- 同样相关:如何避免在python中循环导入?,在python中循环(或循环)导入
- 工作代码不一定是设计良好的代码。您的顾问使用本地导入,因为它们具有循环依赖性。但是循环依赖通常是代码味道的标志。
- @poke"循环依赖性通常是代码气味的标志",这肯定是pyhton特有的观点。在爪哇/ C·/斯威夫特从未有过这样的问题。
- 再说一次,仅仅因为它有效,并不意味着它设计得很好。仅举一个例子:循环引用有什么问题?也适用于其他语言。
- "其他语言似乎解决了这个问题——其他语言没有解决循环依赖性的问题。循环依赖性可能总是一个难题。然而,python的from导入以一种不寻常的方式工作,这使得将自己引入循环依赖性问题变得比应该的更容易。
- 相关的python常见问题解答条目。
- 老实说,我只是稍微同意最后一点,"一般来说,循环引用只是简单的混淆,在试图理解程序如何工作时会大大增加认知负荷。"至于"循环引用有什么问题"的其余部分,我不太在乎。带有Spring的Java具有依赖注入,并且可以根据需要添加Java中的所有循环导入。
- 我总是确保将代码拆分为不同"域"的不同文件。只为helper函数提供一个文件,为db函数提供一个文件,为每个模型enity提供一个文件,依此类推。它使每个文件保持一致并易于跟踪。这种循环依赖完全破坏了该工作流
循环依赖是由A导入B和B导入A引起的。通常的解决方案是使A导入B和A,这样A和B就不必互相导入了。如果两个文件的耦合太紧,也可以将它们连接起来。
这在几乎所有语言中都是一个问题;解析具有循环依赖关系的代码比较困难,因此大多数语言都将其限制为有向非循环图。
通过在函数中导入模块,可以避免循环依赖。有点。首先A导入B,然后,当调用函数时,B可以导入A。因为必须调用函数B才能导入A,所以不能得到相同的A导入B导入A导入B…循环。
我们处理循环依赖关系是因为,嗯,我们通常不创建它们。当两个模块相互需要时,这种情况并不常见。
如果您不能将A和B模块重构为同时导入的公共模块C,那么您应该只对其中一个模块使用本地导入,只在需要它的函数中使用。
但实际上,您最好修改模块。