gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 21:30:59 29 4
gpt4 key购买 nike

早上好

我目前正在编写一个 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,a导入baz.c2) 你在 foo/bar 中移动 c。 a.py 导入 c,b.py 导入 .c3) 你将 c 移动到其他地方(比如 foo/cpackage/c.py),然后 a 和 b 都导入 cpackage.c

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

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

最佳答案

“我画了一个导入依赖图,我打算按层级聚合类。”

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

导入是一流的语句,应该具有实际意义。按“层级”(无论是什么)组织事物应该清晰、有意义且显而易见。

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

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

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

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

您的目标是明确。

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

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


编辑

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

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

关于python - 如何正确组织包/模块依赖树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/527919/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com