PEP8:Python 编码规范
代码编排
- 缩进采用 4 个空格,不使用 Tab 进行缩进,不能混合使用 Tab 和空格,可以利用 IDE 将 Tab 转换为 4 个空格。
- 每行最大长度为 79 字符,包含缩进空格。需要换行可以使用
\
,最好使用圆括号,圆括号内的内容换行不需要反斜线。换行回车要在操作符后面出现,即操作符不能在一行中打头。 - 类和 top-level 函数定义、全局变量定义之间空两行书写;类中方法定义之间空一行书写;函数内逻辑无关段落之间空一行;其他位置尽量不要空行。
文档编排
- 模块中内容的顺序为:
- 模块说明和 docstring;
- import,库的引用按照标准库、第三方库和自编库的顺序依次排放,三者之间空一行;
- 全局变量(globals)与常量(constants);
- 其他定义。
- 不要在一条 import 中引用多个库。
- 如果采用
from package.module import xx
方式引用库,可以省略 module;如果产生命名冲突需要明确采用import module
。
例如:
"""This is the example.
The docstring stuff
"""
from __future__ import barry_as_FLUFL
__all__ = ['a', 'b', 'c']
__version__ = '0.1'
__author__ = 'FarDawn'
import os
import sys
空格的使用
- 所有右括号前不要加空格。
- 逗号、冒号、分号前不要加空格。
- 函数的左括号前不要加空格。
- 序列的左括号前不要加空格。
- 操作符的左右各加一个空格,不要为了对齐添加额外的空格。
- 函数默认参数使用赋值符左右不添加空格。
- 不要在一行内写入多条语句。
if
/for
/while
语句中,即便语句块中只有一条语句,也必须另起一行书写。
注释
- 在代码块前增加的注释,在
#
后增加一个空格。 - 尽量避免采用在语句后增加注释的行注释方式。
- 避免无谓的注释。
文档描述
- 所有的共有模块、函数、类、方法都应该附加 docstring;非共有的内容可不加。
- 如果 docstring 需要换行,可以使用三引号括起的方式。
命名规范
- 尽量单独使用小写字母
i
、大写字母O
等易混淆字母。 - 模块命名尽量短小,使用全部小写的方式,可以使用下划线。
- 包命名尽量短小,使用全部小写的方式,不可以使用下划线。
- 类的命名使用
CapitalizeWord
格式,模块的内部类采用_CapitalizeWord
格式。 - 异常类命名采用
CapitalizeWordError
格式。 - 全局变量尽量只在模块内有效,类似 C 语言中的
static
;可以采用__all__
或者前缀一条下划线的方式实现。 - 函数命名使用全部小写的方式,可以使用下划线。
- 常量命名使用全部大写的方式,可以使用下划线。
- 类的属性(包括方法和变量)命名使用全部小写的方式,可以使用下划线。
- 类的属性有 3 种作用域:public、non-public 和 subclass API,可以理解为 C++ 中的
public
、private
、protected
,在 non-public 属性前,需要前缀一条下划线。 - 类的属性如果与关键字名称冲突,可后缀一条下划线,不要使用缩略等其他方式。
- 为避免与子类属性命名冲突,在类的一些属性前,前缀两条下划线。
- 类的方法第一个参数必须是
self
(相当于 C++中的 this),静态方法第一个参数必须是cls
(代表类)。
编码建议
- 代码应该兼顾 Python 的不同实现,如 CPython 中,
+
操作符拼合字符串的性能很好,但 Jython 中不是这样,所以应该采用''.join()
来兼顾不同的 Python 实现。 - 与单例内容进行比较时,应该采用
is
或者is not
,例如:if x is not None
。 is not|操作顺序要比
not … is`更加直观。- 在进行排序和比较时,优先选择实现用于比较的六个操作:
__eq__
、__ne__
、__lt__
、__le__
、__gt__
、__ge__
。 - 不要用 Lambda 表达式来定义函数或者方法,始终使用
def
。 - 使用基于类的异常,每个模块和包都要有自己的继承自 Exception 的异常类。
- 异常中不要使用裸露的
except
,except
后要跟具体的 Exception。 - 异常中
try
的代码要尽可能的少。 - 字符串不要使用空格结尾。
- 方法中的所有
return
语句都要有返回值,如果确实不返回内容,要返回None
。 - 尽量使用语义明确的方法替代切片操作。
- 不要使用
==
对布尔值进行比较操作。