PEP8:Python 编码规范

代码编排

  1. 缩进采用 4 个空格,不使用 Tab 进行缩进,不能混合使用 Tab 和空格,可以利用 IDE 将 Tab 转换为 4 个空格。
  2. 每行最大长度为 79 字符,包含缩进空格。需要换行可以使用\,最好使用圆括号,圆括号内的内容换行不需要反斜线。换行回车要在操作符后面出现,即操作符不能在一行中打头。
  3. 类和 top-level 函数定义、全局变量定义之间空两行书写;类中方法定义之间空一行书写;函数内逻辑无关段落之间空一行;其他位置尽量不要空行。

文档编排

  1. 模块中内容的顺序为:
    1. 模块说明和 docstring;
    2. import,库的引用按照标准库、第三方库和自编库的顺序依次排放,三者之间空一行;
    3. 全局变量(globals)与常量(constants);
    4. 其他定义。
  2. 不要在一条 import 中引用多个库。
  3. 如果采用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

空格的使用

  1. 所有右括号前不要加空格。
  2. 逗号、冒号、分号前不要加空格。
  3. 函数的左括号前不要加空格。
  4. 序列的左括号前不要加空格。
  5. 操作符的左右各加一个空格,不要为了对齐添加额外的空格。
  6. 函数默认参数使用赋值符左右不添加空格。
  7. 不要在一行内写入多条语句。
  8. if/for/while 语句中,即便语句块中只有一条语句,也必须另起一行书写。

注释

  1. 在代码块前增加的注释,在#后增加一个空格。
  2. 尽量避免采用在语句后增加注释的行注释方式。
  3. 避免无谓的注释。

文档描述

  1. 所有的共有模块、函数、类、方法都应该附加 docstring;非共有的内容可不加。
  2. 如果 docstring 需要换行,可以使用三引号括起的方式。

命名规范

  1. 尽量单独使用小写字母i、大写字母O等易混淆字母。
  2. 模块命名尽量短小,使用全部小写的方式,可以使用下划线。
  3. 包命名尽量短小,使用全部小写的方式,不可以使用下划线。
  4. 类的命名使用CapitalizeWord格式,模块的内部类采用_CapitalizeWord格式。
  5. 异常类命名采用CapitalizeWordError格式。
  6. 全局变量尽量只在模块内有效,类似 C 语言中的 static;可以采用__all__或者前缀一条下划线的方式实现。
  7. 函数命名使用全部小写的方式,可以使用下划线。
  8. 常量命名使用全部大写的方式,可以使用下划线。
  9. 类的属性(包括方法和变量)命名使用全部小写的方式,可以使用下划线。
  10. 类的属性有 3 种作用域:public、non-public 和 subclass API,可以理解为 C++ 中的 publicprivateprotected,在 non-public 属性前,需要前缀一条下划线。
  11. 类的属性如果与关键字名称冲突,可后缀一条下划线,不要使用缩略等其他方式。
  12. 为避免与子类属性命名冲突,在类的一些属性前,前缀两条下划线。
  13. 类的方法第一个参数必须是 self(相当于 C++中的 this),静态方法第一个参数必须是 cls(代表类)。

编码建议

  1. 代码应该兼顾 Python 的不同实现,如 CPython 中,+操作符拼合字符串的性能很好,但 Jython 中不是这样,所以应该采用''.join()来兼顾不同的 Python 实现。
  2. 与单例内容进行比较时,应该采用is或者is not,例如:if x is not None
  3. is not|操作顺序要比not … is`更加直观。
  4. 在进行排序和比较时,优先选择实现用于比较的六个操作:__eq____ne____lt____le____gt____ge__
  5. 不要用 Lambda 表达式来定义函数或者方法,始终使用def
  6. 使用基于类的异常,每个模块和包都要有自己的继承自 Exception 的异常类。
  7. 异常中不要使用裸露的 exceptexcept 后要跟具体的 Exception。
  8. 异常中 try 的代码要尽可能的少。
  9. 字符串不要使用空格结尾。
  10. 方法中的所有 return 语句都要有返回值,如果确实不返回内容,要返回 None
  11. 尽量使用语义明确的方法替代切片操作。
  12. 不要使用==对布尔值进行比较操作。