Python 模块的命名规范

131

我有一个模块,其目的是定义一个名为"nib"的类(以及一些相关的类)。我应该如何称呼这个模块本身?"nib"? "nibmodule"? 还是其他什么?

我建议将这个模块本身命名为"nibmodule",以便更清晰地表明它与类"nib"的关系。
5个回答

128

只是鱼翅。将类命名为Nib,使用大写字母N。有关命名约定和其他样式建议的更多信息,请参见Python样式指南PEP 8


3
大多数 Python 项目都遵循这种约定吗?因为我注意到内置的类都是小写的,例如 list、string 等。 - Ram Rachum
4
你对内置类型的观察是正确的。尽管如此,大多数其他在标准库中定义的类都是大写字母开头。 - Stephan202
7
我原以为这是正确的规范,但它似乎存在一个内在问题。比如说我有一个名为 Client 的类,通常我会创建一些实例并将它们命名为 client。但按照你所说的规范,模块名应该是 client,因此我总是不得不给我的实例起一些不自然的名字,比如 client_instance。你对这个问题有什么看法? - Ray
3
假设这个约定将模块命名为“Client”,那么它将与类名“Client”发生冲突。由于只有3种可能的命名变体(clientClientCLIENT),因此实例、类、模块或常量之间总会存在两者之间的冲突。我认为你给模块起与实例或常量相同的名称的情况较少,而给类取相同名称的情况更多,因此这是其他可能性中更好的命名约定。这也将使从模块导入更易读,因为通常导入的是类和常量,而不是变量。 - Ted Klein Bergman
2
内置函数首字母小写是为了暗示它们是使用 C 实现的,而不是 Python。 - Har
@Har PEP 8:“在接口被记录和主要用作可调用对象的情况下,函数的命名约定可以代替使用。” - Alan

44

我会称之为nib.py。并且我也会把类的名称命名为Nib。

在我正在开发的一个较大的Python项目中,我们有很多模块定义了基本上同一个重要类。类名以大写字母开头。模块的名称则以小写字母命名与类名相同。这导致像以下这样的导入:

from nib import Nib
from foo import Foo
from spam.eggs import Eggs, FriedEggs

这有点像模拟Java的方式。每个文件对应一个类。但是增加了灵活性,如果有必要,您可以随时将另一个类添加到单个文件中。


31

我知道从Python的角度来看,我的解决方案并不是很受欢迎,但我更喜欢使用Java的方法:一个模块对应一个类,模块名与类名相同。 我理解Python风格背后的原因,但我不太喜欢一个包含许多类的大文件,尽管可以折叠,但还是觉得难以浏览。

另外一个原因是版本控制:一个大文件意味着您的提交往往集中在那个文件上。这可能导致更多的冲突需要解决。您也会失去附加日志信息,即您的提交修改了特定的文件(因此涉及特定的类)。相反,您只会看到对模块文件的修改,而仅凭提交注释就要理解修改内容。

总之,如果您喜欢Python哲学,请遵循其他帖子的建议。如果您更喜欢Java风格,请创建一个名为Nib.py的文件,其中包含类Nib。


5
提到的问题是由编辑器、版本控制工具的限制引起的,而不是语言或编程风格引起的。每个文件一个类对代码结构有害。使用spyder或类似的编辑器查看类的摘要以帮助导航,并使用两个窗格打开相同的文件。另外,请阅读PEP8。Python用于编写Python代码,Java用于编写Java代码,但Python不适用于编写Java代码。 - 0 _
11
如果我必须把一个模块的所有类放在一个单独的文件中,根据我通常处理的代码大小,我甚至无法打开该文件,与其他同事之间的冲突会飙升,我的老板(比喻性地)会因为我的提议而吐槽我。单个文件的方法不具有可扩展性,PEP-8规范也无法改变这一点。 - Stefano Borini
5
PEP8并没有要求使用单文件方法。每个模块一个类和每个(代码单元)一个文件是非常广泛的光谱中的两个极端。如果您发现每个模块一个文件导致文件大小无法管理,那么您应该考虑重新审视将软件包拆分为模块的方法。 - Chintalagiri Shashank

27

nib 很好。如果不确定,请参考 Python 风格指南。

来自 PEP 8:

包和模块名 模块应该使用短小的全小写字母命名。如果使用下划线可以提高可读性则可以使用。Python 包也应该使用短小的全小写字母命名,虽然不建议使用下划线。

由于模块名映射到文件名,一些文件系统不区分大小写并截断长文件名,因此选择相当短的模块名非常重要 - 在 Unix 上这不是问题,但在代码传输到旧的 Mac 或 Windows 版本或 DOS 时可能会有问题。

当用 C 或 C++ 编写一个扩展模块,并且该模块具有提供更高级别(例如更面向对象)接口的 Python 模块时,C/C++ 模块具有前导下划线(例如 _socket)。


12

来自PEP-8:包和模块名称

模块的名称应该短小、全小写。如果使用下划线可以提高可读性。

Python包的名称也应该短小、全小写,虽然不鼓励使用下划线。

当一个用C或C++编写的扩展模块带有一个提供更高级别(例如更面向对象)接口的Python模块时,C/C++模块前加下划线(例如_socket)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接