我正在编写科学数据分析的应用程序,我想知道构造代码以避免(或解决)循环导入问题的最佳方法是什么。目前我正在使用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中。
您如何建议解决此问题:
使用纯OO和继承并将对象拆分为3:CoreContainer
- > SelectionContainer
- > HighLevelContainer
重构代码(一个文件中的所有内容?)
某种Import trickery(最后放入进口)
感谢任何反馈!
答案 0 :(得分:1)
如果您SelectionLib
中的Container
中的函数是DataLib
的“方法”,SelectionLib
导入DataLib
似乎是合理的,而不是相反。< / p>
然后用户代码只会导入DataLib
。这需要一些重构。最大限度地减少用户代码中断的一种可能性是将现有的SelectionLib
和_DataLib
重命名为_SelectionLib
和DataLib
,并将新的{{1}}重命名为{{1}}从任一(或两者)导入必要的位。
顺便说一句,最好遵循PEP-8约定并将模块命名为lowercase_with_underscores。