如何正确组织包/模块依赖树?

时间:2009-02-09 12:19:02

标签: python

早上好,

我目前正在编写一个python库。目前,模块和类以无组织的方式部署,没有合理的设计。当我接近更正式的版本时,我想重新组织类和模块,以便他们有更好的整体设计。我绘制了一个导入依赖关系图,我计划按层级聚合类。此外,我正在考虑对类进行一些修改,以减少这些依赖性。

对于潜在复杂且正在制作的python库的良好整体设计,您的策略是什么?你有什么有趣的建议吗?

由于

更新

我确实在寻找一条经验法则。例如,假设发生这种情况(为清晰起见, init .py已删除)

foo/bar/a.py
foo/bar/b.py
foo/hello/c.py
foo/hello/d.py

现在,如果你碰巧有d.py导入bar.b和a.py导入hello.c,我会认为这是一个糟糕的设置。另一个案例是

foo/bar/a.py
foo/bar/baz/b.py
foo/bar/baz/c.py

假设a.py和b.py都导入c。你有三个解决方案: 1)b导入c,导入baz.c 2)你在foo / bar中移动c。 a.py进口c,b.py进口.c 3)你将c移动到其他地方(比如foo / cpackage / c.py),然后a和b都导入cpackage.c

我倾向于选择3),但是如果c.py作为独立模块没有意义,例如因为你想将它保持为“私有”进入条形码包,我会优先选择1)。

还有许多其他类似的案例。我的经验法则是尽量减少依赖关系和交叉的数量,以防止高度分支,高度交织的设置,但我可能是错的。

3 个答案:

答案 0 :(得分:6)

“我绘制了一个导入依赖关系图,我计划按层级聚合类。”

Python必须像英语(或任何其他自然语言)一样阅读。

导入是一个应具有实际意义的一流陈述。按“层级”(无论是什么)组织事物应该清晰,有意义和明显。

不要将类的任意技术分组转换为模块和模块。

使模块和包明显且符合逻辑,以便导入列表显而易见,简单且符合逻辑。

“另外,我正在考虑对类进行一些修改,以减少这些依赖性。”

减少依赖关系听起来技术性和任意性。它可能不是,但听起来就是这样。没有实际的例子,就不可能说了。

你的目标是清晰。

此外,模块和包是独立的重用单元。 (不是类;类,但本身通常不可重用。)您的依赖树应该反映这一点。您的目标是可以整齐,干净地导入到您的应用程序中的模块。

如果您有许多密切相关的模块(或替代实现),那么可以使用包,但要谨慎使用。 Python库相对平坦;并且有一些智慧。


修改

图层之间的单向依赖是一项基本功能。这更多是关于正确的软件设计而不是关于Python。您应该(1)分层设计,(2)设计,以便层之间的依赖关系非常严格,然后(3)在Python中实现。

包装可能不一定精确适合您的分层。这些包实际上可以是一个平面的目录列表,其依赖关系仅通过import语句表示。

答案 1 :(得分:0)

问题非常模糊。

您可以通过从库的其余部分导入任何内容的基本/核心内容以及从此处导入的具体实现来实现此目的。除了“在导入时没有两个模块从彼此导入”之外,你应该没事。

module1.py:

import module2

module2.py:

import module1

这不起作用!

答案 2 :(得分:0)

这取决于项目,对吗? 例如,如果您使用的是模型 - 视图 - 控制器设计,那么您的包的结构将使3组代码独立。

如果您需要一些想法,请打开您的site-packages目录,并查看这些模块中的一些代码,了解它们的设置方式。

没有更多关于模块的信息,没有正确的方法;正如阿里所说,这是一个模糊的问题。你真的只需要分析你面前的东西,找出可能更好的东西。