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

2024-01-10

早上好,

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

对于一个潜在复杂且正在开发的 Python 库,您的良好总体设计策略是什么?您有有趣的建议吗?

Thanks

Update:

我确实在寻找经验法则。例如,假设发生这种情况(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,a导入baz.c 2) 将 c 移至 foo/bar 中。 a.py 导入 c,b.py 导入 .c 3)你将c移到其他地方(比如foo/cpackage/c.py),然后a和b都导入cpackage.c

我倾向于选择 3),但如果 c.py 作为独立模块没有意义,例如因为您想将其“私有”到 bar 包中,我会优先选择 1)。

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


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

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

import 是一个一流的语句,应该具有真正的含义。按“层级别”(无论是什么)组织事物应该是清晰的、有意义的和明显的。

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

使模块和包明显且合乎逻辑,以便导入列表明显、简单且合乎逻辑。

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

减少依赖性听起来很技术性且任意。可能不是,但听起来是这样。没有实际的例子,这是不可能说的。

你的目标是清晰。

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

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


Edit

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

这些包不一定完全适合您的分层。这些包在物理上可能是目录的平面列表,其依赖关系仅通过以下方式表达import声明。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何正确组织包/模块依赖树? 的相关文章

随机推荐