Python循环导入:解决方案和最佳实践

时间:2013-07-14 20:53:26

标签: python import ipython circular-dependency scientific-computing

我正在编写科学数据分析的应用程序,我想知道构造代码以避免(或解决)循环导入问题的最佳方法是什么。目前我正在使用OO和程序编程的混合。

Other questions以更抽象的方式解决了这个问题。在这里,我正在寻找一种在更具体的环境中最佳的解决方案。

我在Container中定义了一个类DataLib.py,其数据包含在列表和/或数组中。所有方法和支持函数DataLib.py都非常大(~1000行)。

我有第二个模块SelectionLib.py(约400行),它只包含根据不同标准“过滤”Container中数据的功能。这些函数返回新的Container个对象(包含已过滤的数据),因此SelectionLib.py需要从Container导入DataLib.py。注意,从逻辑上讲,这些函数是“Container”的“方法”,它们只是使用python函数实现的。

现在,我想为Container添加一些高级方法,以便可以使用方法调用的单个函数执行复杂分析。通过“复杂分析”,我指的是任意数量的Container方法调用,本地函数(在DataLib.py中定义)和过滤函数(在SelectionLib.py中定义)。

问题是DataLib.py需要导入SelectionLib.py才能使用过滤功能,但SelectionLib.py已导入DataLib.py

正确地知道我的hackish解决方案是使用运行-i ... IPython 运行这两个文件,所以它就像拥有一个大的单个文件而我避免了循环导入。但与此同时,这些脚本很难集成,例如在GUI中。

您如何建议解决此问题:

  1. 使用纯OO和继承并将对象拆分为3:CoreContainer - > SelectionContainer - > HighLevelContainer

  2. 重构代码(一个文件中的所有内容?)

  3. 某种Import trickery(最后放入进口)

  4. 感谢任何反馈!

1 个答案:

答案 0 :(得分:1)

如果您SelectionLib中的Container中的函数是DataLib的“方法”,SelectionLib导入DataLib似乎是合理的,而不是相反。< / p>

然后用户代码只会导入DataLib。这需要一些重构。最大限度地减少用户代码中断的一种可能性是将现有的SelectionLib_DataLib重命名为_SelectionLibDataLib,并将新的{{1}}重命名为{{1}}从任一(或两者)导入必要的位。

顺便说一句,最好遵循PEP-8约定并将模块命名为lowercase_with_underscores。