Google Python 编程规范指南
目录
GOOGLE PYTHON 编程规范指南 ............................................................................................................................ 1
目录 ............................................................................................................................................................................. 1
扉页 ............................................................................................................................................................................. 3
背景 ............................................................................................................................................................................. 3
PYTHON 语言规范 ........................................................................................................................................................ 4
LINT .................................................................................................................................................................................... 4
导入 .................................................................................................................................................................................. 5
包 ...................................................................................................................................................................................... 6
异常 .................................................................................................................................................................................. 7
全局变量 .......................................................................................................................................................................... 8
嵌套/局部/内部类或函数 ............................................................................................................................................... 9
列表推导(LIST COMPREHENSIONS) ........................................................................................................................................ 9
默认迭代器和操作符 .................................................................................................................................................... 11
生成器 ............................................................................................................................................................................ 12
LAMBDA 函数 ................................................................................................................................................................... 12
条件表达式 .................................................................................................................................................................... 13
默认参数值 .................................................................................................................................................................... 14
属性(PROPERTIES) .............................................................................................................................................................. 14
TRUE/FALSE 的求值 ........................................................................................................................................................... 16
过时的语言特性 ............................................................................................................................................................ 18
词法作用域(LEXICAL SCOPING) .......................................................................................................................................... 19
函数与方法装饰器 ........................................................................................................................................................ 20
线程 ................................................................................................................................................................................ 21
威力过大的特性 ............................................................................................................................................................ 21
分号 ................................................................................................................................................................................ 22
行长度 ............................................................................................................................................................................ 22
括号 ................................................................................................................................................................................ 23
缩进 ................................................................................................................................................................................ 24
空行 ................................................................................................................................................................................ 25
空格 ................................................................................................................................................................................ 25
SHEBANG ........................................................................................................................................................................... 26
注释 ................................................................................................................................................................................ 27
类 .................................................................................................................................................................................... 30
字符串 ............................................................................................................................................................................ 30
文件和 SOCKETS ................................................................................................................................................................ 32
TODO 注释 ..................................................................................................................................................................... 33
导入格式 ........................................................................................................................................................................ 33
语句 ................................................................................................................................................................................ 34
访问控制 ........................................................................................................................................................................ 34
命名 ................................................................................................................................................................................ 35
MAIN ................................................................................................................................................................................ 36
临别赠言 ..................................................................................................................................................................... 38
扉页
版本:
2.59
原作者:
Amit Patel
Antoine Picard
Eugene Jhong
Jeremy Hylton
Matt Smart
Mike Shields
翻译:
guoqiao v2.19
xuxinkun v2.59
项目主页: Google Style Guide
Google 开源项目风格指南 - 中文版
最后排版 xiaoqingwang
官方网址:
https://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/contents/
背景
Python 是 Google 主要的脚本语言。这本风格指南主要包含的是针对 python 的编程准则。
为帮助读者能够将代码准确格式化,我们提供了针对 Vim 的配置文件 (链接指向 github)。
对于 Emacs 用户,保持默认设置即可。
Python 语言规范
Lint
Tip
对你的代码运行 pylint
定义:
pylint 是一个在 Python 源代码中查找 bug 的工具。对于 C 和 C++这样的不那么动态的
(译者注:原文是 less dynamic)语言, 这些 bug 通常由编译器来捕获。由于 Python 的
动态特性, 有些警告可能不对。不过伪告警应该很少)
优点:
可以捕获容易忽视的错误, 例如输入错误, 使用未赋值的变量等。
缺点:
pylint 不完美。要利用其优势, 我们有时侯需要:
a) 围绕着它来写代码
b) 抑制其告警
c) 改进它, 或者
d) 忽略它。
结论:
确保对你的代码运行 pylint。抑制不准确的警告,以便能够将其他警告暴露出来。
你可以通过设置一个行注释来抑制告警。例如:
dict = 'something awful' # Bad Idea... pylint: disable=redefined-builtin
pylint 警告是以一个数字编号(如 C0112 )和一个符号名(如 empty-docstring )来标识的。在编
写新代码或更新已有代码时对告警进行医治, 推荐使用符号名来标识。
如果警告的符号名不够见名知意,那么请对其增加一个详细解释。
采用这种抑制方式的好处是我们可以轻松查找抑制并回顾它们。
你可以使用命令 pylint --list-msgs 来获取 pylint 告警列表。你可以使用命
令 pylint --help-msg=C6409 , 以获取关于特定消息的更多信息。
相比较于之前使用的 pylint: disable-msg , 本文推荐使用 pylint: disable 。
要抑制“参数未使用”告警, 你可以用"_"作为参数标识符, 或者在参数名前加"unused_"。
遇到不能改变参数名的情况, 你可以通过在函数开头”提到”它们来消除告警。例如:
def foo(a, unused_b, unused_c, d=None, e=None):
_ = d, e
return a
导入
Tip
仅对包和模块使用导入
定义:
模块间共享代码的重用机制。
优点:
命名空间管理约定十分简单。每个标识符的源都用一种一致的方式指示。x.Obj 表示 Obj
对象定义在模块 x 中。
缺点:
模块名仍可能冲突。有些模块名太长, 不太方便。
结论:
使用 import x 来导入包和模块。
使用 from x import y , 其中 x 是包前缀, y 是不带前缀的模块名。
使用 from x import y as z , 如果两个要导入的模块都叫做 y 或者 y 太长了。
例如, 模块 sound.effects.echo 可以用如下方式导入:
from sound.effects import echo
...
echo.EchoFilter(input, output, delay=0.7, atten=4)
导入时不要使用相对名称。即使模块在同一个包中, 也要使用完整包名。这能帮助你避
免无意间导入一个包两次。
包
Tip
使用模块的全路径名来导入每个模块
优点:
避免模块名冲突。查找包更容易。
缺点:
部署代码变难, 因为你必须复制包层次。
结论:
所有的新代码都应该用完整包名来导入每个模块。
应该像下面这样导入:
# Reference in code with complete name.
import sound.effects.echo
# Reference in code with just module name (preferred).
from sound.effects import echo
异常
Tip
允许使用异常, 但必须小心
定义:
异常是一种跳出代码块的正常控制流来处理错误或者其它异常条件的方式。
优点:
正常操作代码的控制流不会和错误处理代码混在一起。当某种条件发生时, 它也允许控
制流跳过多个框架。例如, 一步跳出 N 个嵌套的函数, 而不必继续执行错误的代码。
缺点:
可能会导致让人困惑的控制流。调用库时容易错过错误情况。
结论:
异常必须遵守特定条件:
1. 像这样触发异常: raise MyException("Error message") 或者 raise MyException 。不要使
用两个参数的形式( raise MyException, "Error message" )或者过时的字符串异常
( raise "Error message" )。
2. 模块或包应该定义自己的特定域的异常基类, 这个基类应该从内建的 Exception 类继
承。模块的异常基类应该叫做”Error”。
1. class Error(Exception):
2. pass
3. 永远不要使用 except: 语句来捕获所有异常, 也不要捕获 Exception 或
者 StandardError , 除非你打算重新触发该异常, 或者你已经在当前线程的最外层(记
得还是要打印一条错误消息)。在异常这方面, Python 非常宽容, except: 真的会捕获
包括 Python 语法错误在内的任何错误。使用 except: 很容易隐藏真正的 bug。
4. 尽量减少 try/except 块中的代码量。try 块的体积越大, 期望之外的异常就越容易被触
发。这种情况下, try/except 块将隐藏真正的错误。
5. 使用 finally 子句来执行那些无论 try 块中有没有异常都应该被执行的代码。这对于清理
资源常常很有用, 例如关闭文件。
6. 当捕获异常时, 使用 as 而不要用逗号。例如
7. try:
8. raise Error
9. except Error as error:
10. pass
全局变量
Tip
避免全局变量
定义:
定义在模块级的变量。
优点:
偶尔有用。
缺点:
导入时可能改变模块行为,因为导入模块时会对模块级变量赋值。
结论:
避免使用全局变量, 用类变量来代替。但也有一些例外:
1. 脚本的默认选项。