类的名称必须简明、精确,并足以使人理解类的作用。常见的做法是使用后缀来表示
其类型或特性。例如:
• SQLEngine;
• MimeTypes;
• StringWidget;
• TestCase。
对于基类或抽象类,可以使用一个Base 或Abstract 前缀,如下所示:
• BaseCookie;
• AbstractFormatter。
最重要的是要和类属性保持一致。例如,尽量避免类及其属性名称之间的冗余:
SMTP.smtp_send() # 命名空间中存在冗余信息
SMTP.send() # 可读性更强,也更易于记忆
模块和包的名称
模块和包的名称应体现其内容的目的。其名称应简短、使用小写字母、并且不带下划线:
• sqlite;
• postgres;
• sha1。
如果它们实现一个协议,那么通常会使用lib 后缀,代码如下:
import smtplib
import urllib
import telnetlib
它们还需要在命名空间中保持一致,这样使用起来更加简单,代码如下:
from widgets.stringwidgets import TextWidget # 不好
from widgets.strings import TextWidget # 更好
同样,应该始终避免使用与标准库模块相同的名称。
如果一个模块开始变得复杂,并且包含许多类,那么好的做法是创建一个包并将模块
的元素划分到其他模块中。
__init__模块也可以用于将一些API 放回顶层,因为它不会影响使用,但有助于将代码
重新组织为更小的部分。例如,考虑foo 包中的__init__模块,其内容如下所示:
from .module1 import feature1, feature2
from .module2 import feature3
这将允许用户直接导入特性,如下列代码所示:
from foo import feature1, feature2, feature3
但要注意,这可能会增加循环依赖的可能性,并且在__init__模块中添加的代码将被
实例化。所以要小心使用。
有用的工具
前面的约定和实践的一部分可以使用下列工具来控制和处理。
• Pylint:一个非常灵活的源代码分析器。
• pep8 和flake8:它们是小型的代码风格检查器,也是包装器,添加了一些更有用的
特性,例如静态分析和复杂度测量。