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

Python 如何正确组织包/模块依赖关系树?,python,Python,早上好 我目前正在编写一个python库。目前,模块和类是以无组织的方式部署的,没有合理的设计。随着我接近一个更正式的版本,我想重新组织类和模块,以便它们具有更好的总体设计。我画了一张导入依赖关系图,并计划按层聚合类。此外,我还考虑对类进行一些修改,以减少这些依赖性 在制作python库时,对于一个潜在的复杂和复杂的应用程序,您的总体设计策略是什么?你有什么有趣的建议吗 谢谢 更新: 我确实在寻找经验法则。例如,假设发生了这种情况(init.py已删除以清楚起见) 现在,如果您恰好有D.Py导入

早上好

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

在制作python库时,对于一个潜在的复杂和复杂的应用程序,您的总体设计策略是什么?你有什么有趣的建议吗

谢谢

更新:

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

现在,如果您恰好有D.Py导入栏.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,a进口baz.c 2) 在foo/bar中移动c。a、 py imports c,b.py imports.c 3) 将c移到其他地方(比如foo/cpackage/c.py),然后a和b都导入cpackage.c

我倾向于选择3),但如果c.py作为一个独立的模块没有任何意义,例如,因为您希望将其“私有”保存到bar包中,我会选择1)


还有许多其他类似的情况。我的经验法则是尽量减少依赖项和交叉项的数量,以防止出现高度分支、高度交织的设置,但我可能错了

这个问题很模糊

您可以通过让基本/核心内容不从库的其余部分导入任何内容,并从这里导入具体的实现来实现这一点。除了“在导入时没有两个模块相互导入”,您应该很好

模块1.py:

import module2
模块2.py:

import module1
这行不通

“我画了一张导入依赖关系图,并计划按层聚合类。”

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

import是一个具有实际意义的一流语句。按“层次层次”(不管是什么)组织事情应该清晰、有意义和明显

不要将类任意技术分组为模块,将模块分组为包

使模块和包清晰、合理,以便导入列表清晰、简单、合理

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

减少依赖性听起来既技术性又武断。也许不是,但听起来是这样的。没有实际的例子,这是不可能的

你的目标是清晰

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

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


编辑

层之间的单向依赖是一个基本特性。这更多的是关于正确的软件设计,而不是Python。您应该(1)在层中进行设计,(2)设计使层之间的依赖关系非常严格,然后(3)在Python中实现这一点


包装可能不一定完全适合您的分层。包在物理上可能是一个目录的平面列表,依赖项仅通过
import
语句表示。

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

如果您需要一些想法,请打开站点包目录,查看这些模块中的一些代码,了解它们是如何设置的


不了解更多模块,就没有正确的方法;正如阿里所说,这是一个模糊的问题。你真的需要分析你面前的东西,找出更好的方法。

对于层,我的意思是组织我的包,使它们的类/模块依赖于该包的内容,或者依赖于另一个包含“较低”服务的包。我会把每个包看作是一个“独立的库”,最终取决于其他包,因此不具有循环依赖关系。实际上,你的例子是IS/WI/Work。我不会投反对票,因为你的方法是一个很好的经验法则:不要让两个模块相互导入,如果它们需要,请修复你的设计。
import module1