2016-10-14 206 views
0

我们选择python作为新项目,因为我们想使用一种语言,我们可以用非冗长的方式编写漂亮的代码。Python循环依赖关系

我们,我们以前写的代码顾问带来了一个很大的工作方案。但是当我们看代码时,它充斥着本地功能from X import Y。我们迅速将导入移动到文件的顶部,但现在受到循环依赖关系的影响。我们绝对不希望解决循环依赖问题,我们不希望将导入移回到非常冗长的函数中。

问题1:我们如何解决这个问题?

问题2:这是什么循环依赖无感?当其他语言似乎解决了这个问题时,Python社区如何接受这个问题? (我希望它不被认为是某种功能)

+0

另外相关:[?如何避免在Python圆形进口(http://stackoverflow.com/questions/7336802/how-to-avoid-circular-imports-in-python),[圆形(或环)导入Python](http://stackoverflow.com/questions/744373/circular-or-cyclic-imports-in-python) – poke

+0

工作代码不一定是精心设计的代码。您的顾问使用本地进口,因为他们有循环依赖关系。但循环依赖通常是代码异味的标志。 – poke

+0

@poke“循环依赖通常是代码异味的标志”这肯定是Pyhton的具体观点。从来没有在Java/C#/ Swift中出现任何这样的问题 –

回答

3

循环依赖性是由A导入B和B导入A导致的。通常的解决方案是生成一个C,它导入B和A以便A和B不必相互导入。如果两个文件耦合得太紧,也可以连接这两个文件。

这是几乎所有语言的问题;用循环依赖关系来解析代码很困难,所以大多数语言都将它限制为一个有向无环图。

通过导入内部功能模块,您避免循环依赖。有些。首先A导入B,然后,当函数被调用时,B可以导入A.因为你必须调用B的函数来导入A,所以你不会得到相同的A导入B导入A导入B ...循环。

2

我们处理循环依赖,因为我们通常不创建它们。当两个模块需要彼此时并不常见。

如果你不能重构你的A和B模块插入,无论进口,你应该只使用本地进口的模块之一,只有在需要它的功能的通用模块C。

但是,真的,你会更好地修改你的模块。