只挑重要且难以auto-pep8的
1. 前言
PEP stands for Python Enhancement Proposal. A PEP is a design document providing information to the Python community, or describing a new feature for Python or its processes or environment. The PEP should provide a concise technical specification of the feature and a rationale for the feature.
PEP 是Python增强提案的缩写。PEP 是一个设计文档,为 Python 社区提供信息,或者描述一个新的 Python 或其过程或环境的新特性。PEP 应该提供一个简明扼要的功能技术规范和功能的理由。
2. 换行应该在二元操作符的前面

- Python核心发布中的代码应该始终使用UTF-8
- 所有标识符必须使用ASCII标识符和英文单词
3. 导入
导入应该按照以下顺序分组
- 标准库导入
- 相关的第三方导入
- 特定的本地应用/库导入
- 在每个导入组之间放一行空行
4. 绝对导入与相对导入
- 明确的相对导入可以用来接受替代绝对导入,特别是处理复杂包布局时,绝对导入过于冗长
- 标准库代码应该避免复杂包布局并使用绝对导入
- 避免使用通配符导入(from <模块名> import *),因为它们使哪些名字出现在命名空间变得不清楚
5. 尾部逗号
为了代码更加清晰,元组只有一个元素时请务必用括号括起来
每个元素独占一行,然后尾部都有逗号,在最后一个元素的下一行写闭标签。如果你的数据结构都是写在同一行的,就没有必要保留尾部逗号了
6. 命名规范
7. 驼峰命名法(CapWords)
- 首字母大写的字符串
- 当CapWords中使用缩写,大写所有的缩写字母。因此HTTPServerError优于HttpServerError
8. 特殊形式
单前导下划线:弱“内部使用”标志。例如 from M import *不会导入以下划线开头的对象。
单后置下划线:按惯例使用避免与Python关键字冲突,例如
Tkinter.Toplevel(master, class_='ClassName')
双前导下划线:当命名类属性,调用时名称改编(类FooBar中,
__boo
变成_FooBar__boo
;见下文)。前导和后置都是双下划线:存在于用户控制的命名空间的“神奇”的对象或属性。
9. 避免采用的名字
不要使用字符‘l’(小写字母el),‘O’(大写字母oh)或‘I’(大写字母eye)作为单字符变量名。
在某些字体中,这些字符与数字1和0是没有区别的。当想使用‘l’时,用‘L’代替
10. 包名和模块名
模块名应该短,所有的字母小写。可以在模块名中使用下划线来提高可读性。Python包名也应该短,所有的字母小写,不鼓励使用下划线。
当一个C或C++书写的扩展模块,伴随Python模块来提供了一个更高层次(例如更面向对象)的接口时,C/C++模块名有一个前导下划线(如_socket)
11. 类名
类名通常使用首字母大写字符串的规则
12. 全局变量名
模块设计为通过from M import *来使用,应使用
__all__
机制防止导出全局变量,或使用加前缀的旧规则,为全局变量加下划线(可能你像表明这些全局变量是“非公开模块”)
13. 函数和方法参数
- 使用
self
做实例化方法的第一个参数。- 使用
cls
做类方法的第一个参数。- 如果函数的参数名与保留关键字冲突,最好是为参数名添加一个后置下划线而不是使用缩写或拼写错误。因此class_ 比clss好。(也许使用同义词来避免更好。)。
14. 函数名
函数名应该是小写字母,必要时单词用下划线分开以提高可读性
15. 常量
常量通常定义于模块级别并且所有的字母都是大写,单词用下划线分开。例如MAX_OVERFLOW和TOTAL
16. 程序设计建议
不要依赖CPython的高效实现字符串连接的语句形式
+= b
或a = a + b
- 应使用’’.join()形式。这将确保跨越不同实现的连接发生在线性时间
与单值比如None比较使用
is
或is not
,不要用等号操作符- 大概也就True/False/None这些
使用if x is not None,谨防编写if x
使用is not操作符而不是not…is
当实现有丰富的比较的排序操作时,最好实现所有六个操作符(__eq__,__ne__,__lt__,__le__,__gt__,__ge__)而不是依靠其它代码只能进行一个特定的比较。为了减少所涉及的工作量,functools.total_ordering()装饰器提供了一个工具来生成缺失的比较函数
使用def语句而不是使用赋值语句将lambda表达式绑定到标识符上