早上好,
我目前正在编写一个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)。
还有许多其他类似的案例。我的经验法则是尽量减少依赖关系和交叉的数量,以防止高度分支,高度交织的设置,但我可能是错的。
答案 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目录,并查看这些模块中的一些代码,了解它们的设置方式。
没有更多关于模块的信息,没有正确的方法;正如阿里所说,这是一个模糊的问题。你真的只需要分析你面前的东西,找出可能更好的东西。