3 回答
TA贡献1835条经验 获得超7个赞
首先是一些术语:
“脚本”是打算直接执行的 python (.py) 文件 (
python myscript.py
)“模块”是一个 Python 文件(通常主要包含函数和类定义),旨在由脚本或其他模块导入。
“包”是一个最终包含模块和(在 py2 中是必需的,而不是在 py3 中)
__init__.py
文件的目录。
您可以查看教程以获取有关模块和包的更多信息。
基本上,您想要的是以连贯的单元(包/模块/脚本)组织您的代码。
对于一个完整的应用程序,您通常会有一个“主”模块(不必命名为“main.py”——实际上它通常被命名为应用程序本身),它只会导入一些定义(来自 stdlib,来自 3rd部分库和您自己的模块),设置内容并运行应用程序的入口点。在您的示例中,这将是“start.py”脚本。
对于剩下的代码,你想要的是每个模块具有很强的内聚性(其中定义的函数和类密切相关并一致实现相同的功能)和低耦合(每个模块尽可能独立于其他模块)。从技术上讲,您可以在单个模块中放置尽可能多的函数和类,但是太大的模块可能会变得难以维护,因此如果在基于高内聚/低耦合的第一次重组后,您会发现自己有 5000+klocs模块你可能想把它变成一个包含更专业的子模块的包。
如果您仍然有几个实用程序函数显然不适合您的任何模块,通常的解决方案是将它们放在“utils.py”(或“misc.py”或“helpers.py”等)中模块。
您绝对要避免的两件事是:
循环依赖,可以是直接的(模块 A 依赖于模块 B,模块 B 依赖于模块 A),也可以是间接的(模块 A 依赖于模块 B,而模块 B 又依赖于模块 A)。如果你发现你有这样的情况,这意味着你应该将两个模块合并在一起或提取一些定义到第三个模块。
通配符导入(“从模块导入 *”),这是一个主要的 PITA wrt/可维护性(您无法从导入中得知某些名称是从哪里导入的)并使代码容易受到意外 - 有时并不明显 - 损坏
正如您所看到的,这仍然是一个非常通用的指南,但是不能自动决定哪些属于一起,最终取决于您自己的判断。
TA贡献1770条经验 获得超3个赞
pythonic 处理单个文件的方法(我将讨论,因为它主要适用于类)是单个文件是一个模块(不是我之前所说的包)。
许多工具通常存在于单个包中,但单个模块中的所有工具应始终围绕一个主题。话虽如此,我通常会将一个非常小的项目保存在一个文件中,其中包含多个函数和几个类。然后我会使用 if main 来包含脚本,因为我希望它完整地运行。
if __name__== '__main__':
我会尽可能将逻辑分解为函数,以便脚本的主体可以作为更高级别的逻辑可读。
简短回答:无法在任何规模上管理每个功能的文件。您应该将东西放在具有相关功能的文件(模块)中。是否应将当前功能聚集到模块中取决于您。
添加回答
举报