1

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

其他问题以更抽象的方式解决了这个问题。在这里,我正在寻找在更具体的上下文中最佳的解决方案。

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

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

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

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

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

你建议如何解决这个问题:

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

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

  3. 某种进口诡计(将导入放在最后)

任何反馈表示赞赏!

4

1 回答 1

2

如果函数 inSelectionLib是,正如你所说的,“方法” Container,那么DataLibimports似乎是合理的SelectionLib,而不是相反。

然后用户代码将只导入DataLib. 这将需要一些重构。最大程度地减少对用户代码的干扰的一种可能性是将现有的DataLiband重命名SelectionLib_DataLiband _SelectionLib,并有一个新DataLib的来从其中一个(或两个)导入必要的位。

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

于 2013-07-17T10:11:01.120 回答