为了账号安全,请及时绑定邮箱和手机立即绑定

有多个脚本文件更好还是每个功能只有一个大脚本文件更好?

有多个脚本文件更好还是每个功能只有一个大脚本文件更好?

慕少森 2021-10-19 16:35:05
大约一年前,我开始了一个项目,涉及一个简单的基于终端的 RPG 和 Python 3。没有真正考虑它,我就跳了进去。我开始为每个脚本组织多个脚本......好吧,功能。但是在项目进行到一半时,对于最终目标,我不确定只有一个非常大的脚本文件或多个文件是否更容易/更有效。由于我将cmd模块用于终端,我意识到让实际的应用程序运行成为一个循环游戏可能对所有这些外部文件具有挑战性,但同时我有一个__init__.py文件来组合所有功能主运行脚本。这是文件结构。澄清一下,我不是最伟大的程序员,而且我是 Python 新手。我不确定cmd模块的兼容性问题。所以我的问题是这样的;我应该保留这个结构并且它应该按预期工作吗?或者我应该将所有这些assets脚本合并到一个文件中吗?或者甚至将它们与使用的 start.py 分开cmd?这是 start 函数,以及各种脚本的一些片段。
查看完整描述

3 回答

?
qq_花开花谢_0

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”等)中模块。

您绝对要避免的两件事是:

  1. 循环依赖,可以是直接的(模块 A 依赖于模块 B,模块 B 依赖于模块 A),也可以是间接的(模块 A 依赖于模块 B,而模块 B 又依赖于模块 A)。如果你发现你有这样的情况,这意味着你应该将两个模块合并在一起或提取一些定义到第三个模块。

  2. 通配符导入(“从模块导入 *”),这是一个主要的 PITA wrt/可维护性(您无法从导入中得知某些名称是从哪里导入的)并使代码容易受到意外 - 有时并不明显 - 损坏

正如您所看到的,这仍然是一个非常通用的指南,但是不能自动决定哪些属于一起,最终取决于您自己的判断。


查看完整回答
反对 回复 2021-10-19
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

pythonic 处理单个文件的方法(我将讨论,因为它主要适用于类)是单个文件是一个模块(不是我之前所说的包)。

许多工具通常存在于单个包中,但单个模块中的所有工具应始终围绕一个主题。话虽如此,我通常会将一个非常小的项目保存在一个文件中,其中包含多个函数和几个类。然后我会使用 if main 来包含脚本,因为我希望它完整地运行。

if __name__== '__main__':

我会尽可能将逻辑分解为函数,以便脚本的主体可以作为更高级别的逻辑可读。

简短回答:无法在任何规模上管理每个功能的文件。您应该将东西放在具有相关功能的文件(模块)中。是否应将当前功能聚集到模块中取决于您。


查看完整回答
反对 回复 2021-10-19
  • 3 回答
  • 0 关注
  • 297 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信