Google Python 风格指南 - 中文版
Release 2.19
Guo Qiao
October 14, 2011
CONTENTS
1 目录
1.1 Python 语言规范 . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.1.1 pychecker . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.1.2 导入 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.1.3 包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.1.4 异常 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.1.5 全局变量 . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.1.6 嵌套/局部/内部类或函数 . . . . . . . . . . . . . . . . . . . . .
1.1.7 列表推导 (List Comprehensions) . . . . . . . . . . . . . . . .
1.1.8 默认迭代器和操作符 . . . . . . . . . . . . . . . . . . . . . . .
1.1.9 生成器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.1.10Lambda 函数 . . . . . . . . . . . . . . . . . . . . . . . . . .
1.1.11默认参数值 . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.1.12属性 (properties) . . . . . . . . . . . . . . . . . . . . . . .
1.1.13True/False 的求值 . . . . . . . . . . . . . . . . . . . . . . .
1.1.14过时的语言特性 . . . . . . . . . . . . . . . . . . . . . . . . .
1.1.15静态 Scoping(Lexical Scoping) . . . . . . . . . . . . . . . .
1.1.16函数与方法装饰器 . . . . . . . . . . . . . . . . . . . . . . . .
1.1.17线程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.1.18威力过大的特性 . . . . . . . . . . . . . . . . . . . . . . . . .
1.2 Python 风格规范 . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.1 分号 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.2 行长度 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.3 括号 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.4 缩进 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.5 空行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.6 空格 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.7 Python 解释器 . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.8 注释 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.9 类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.10字符串 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.11TODO 注释 . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.12导入格式 . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.13语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.14访问控制 . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.15命名 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.16Main
1.3 临别赠言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
3
3
3
4
4
5
5
5
6
7
7
7
8
9
10
10
11
12
12
12
12
12
13
13
14
14
15
15
17
18
19
19
19
20
20
21
21
i
ii
Google Python 风格指南 - 中文版, Release 2.19
版本 2.19
原作者
Amit Patel
Antoine Picard
Eugene Jhong
Jeremy Hylton
Matt Smart
Mike Shields
翻译 郭桥
项目主页
• Google Style Guide
• Google 开源项目风格指南 - 中文版
CONTENTS
1
Google Python 风格指南 - 中文版, Release 2.19
2
CONTENTS
CHAPTER
ONE
目录
1.1 Python 语言规范
1.1.1 pychecker
Tip: 对你的代码运行 pychecker
定义: pychecker 是一个在 Python 源代码中查找 bug 的工具. 对于 C 和 C++ 这样的不
那么动态的 (译者注: 原文是 less dynamic) 语言, 这些 bug 通常由编译器来捕获.
pychecker 和 lint 类似. 由于 Python 的动态特性, 有些警告可能不对. 不过伪告警应
该很少.
优点: 可以捕获容易忽视的错误, 例如输入错误, 使用未赋值的变量等.
缺点: pychecker 不完美. 要利用其优势, 我们有时侯需要: a) 围绕着它来写代码 b) 抑制其告
警 c) 改进它, 或者 d) 忽略它.
结论: 确保对你的代码运行 pychecker.
关于如何运行 pychecker 的更多信息, 参考 pychecker 主页
你可以设置一个叫做 __pychecker__ 的模块级变量来抑制适当的告警. 例如:
__pychecker__ = ’no-callinit no-classattr’
采用这种抑制方式的好处是我们可以轻松查找抑制并回顾它们.
你可以使用 pychecker --help 来获取 pychecker 告警列表.
要抑制” 参数未使用” 告警, 你可以用”_” 作为参数标识符, 或者在参数名前加”unused_”.
遇到不能改变参数名的情况, 你可以通过在函数开头” 提到” 它们来消除告警. 例如:
def foo(a, unused_b, unused_c, d=None, e=None):
(d, e) = (d, e)
return a
# pychecker
理想情况下, 我们以后会扩展 pychecker 以确保你真的没有使用这些参数.
1.1.2 导入
Tip: 仅对包和模块使用导入
定义: 模块间共享代码的重用机制.
优点: 命名空间管理约定十分简单. 每个标识符的源都用一种一致的方式指示. x.Obj 表示 Obj
对象定义在模块 x 中.
3
Google Python 风格指南 - 中文版, Release 2.19
缺点: 模块名仍可能冲突. 有些模块名太长, 不太方便.
结论: 使用 import x 来导入包和模块.
使用 from x import y , 其中 x 是包前缀, y 是不带前缀的模块名.
使用 from x import y as z, 如果两个要导入的模块都叫做 z 或者 y 太长了.
例如, 模块 sound.effects.echo 可以用如下方式导入:
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
导入时不要使用相对名称. 即使模块在同一个包中, 也要使用完整包名. 这能帮助你避免无意
间导入一个包两次.
1.1.3 包
Tip: 使用模块的全路径名来导入每个模块
优点: 避免模块名冲突. 查找包更容易.
缺点: 部署代码变难, 因为你必须复制包层次.
结论: 所有的新代码都应该用完整包名来导入每个模块.
应该像下面这样导入:
# Reference in code with complete name.
import sound.effects.echo
# Reference in code with just module name (preferred).
from sound.effects import echo
1.1.4 异常
Tip: 允许使用异常, 但必须小心
定义: 异常是一种跳出代码块的正常控制流来处理错误或者其它异常条件的方式.
优点: 正常操作代码的控制流不会和错误处理代码混在一起. 当某种条件发生时, 它也允许控制流跳
过多个框架. 例如, 一步跳出 N 个嵌套的函数, 而不必继续执行错误的代码.
缺点: 可能会导致让人困惑的控制流. 调用库时容易错过错误情况.
结论: 异常必须遵守特定条件:
1. 像这样触发异常: raise MyException(”Error message”) 或者 raise MyExcep-
tion . 不要使用两个参数的形式 ( raise MyException, ”Error message” ) 或
者过时的字符串异常 ( raise ”Error message” ).
2. 模块或包应该定义自己的特定域的异常基类, 这个基类应该从内建的 Exception 类继承.
模块的异常基类应该叫做”Error”.
class Error(Exception):
pass
3. 永远不要使用 except: 语句来捕获所有异常, 也不要捕获 Exception 或者 Stan-
dardError , 除非你打算重新触发该异常, 或者你已经在当前线程的最外层 (记得还是
4
Chapter 1. 目录