摘要
本文给出主 Python 版本标准库的编码约定。 CPython 的 C 代码风格参见 PEP7 。 本文和 PEP 257 文档字符串标准改编自 Guido 最初的《 Python Style Guide 》 , 并增加了 Barry 的 GNU Mailman Coding Style Guide 的部分内容。 本文会随着语言改变等而改变。 许多项目都有自己的编码风格指南,冲突时自己的指南为准。
本文给出主 Python 版本标准库的编码约定。 CPython 的 C 代码风格参见 PEP7 。
本文和 PEP 257 文档字符串标准 改编自 Guido 最初的《 Python Style Guide 》 , 并增加了 Barry 的 GNU Mailman Coding Style Guide 的部分内容。
本文会随着语言改变等而改变。
许多项目都有自己的编码风格指南,冲突时自己的指南为准。
一致性考虑
Guido 的关键点之一是:代码更多是用来读而不是写。本指南旨在改善 Python 代码的可读性,即 PEP 20 所说的 " 可读性计数 "(Readability counts) 。
风格指南强调一致性。项目、模块或函数保持一致都很重要。
最重要的是知道何时不一致 , 有时风格指南并不适用。当有疑惑时运用你的最佳判断,参考其他例子并多问!
特别注意:不要因为遵守本 PEP 而破坏向后兼容性!
部分可以违背指南情况:
- 遵循指南会降低可读性。
- 与周围其他代码不一致。
- 代码在引入指南完成,暂时没有理由修改。
- 旧版本兼容。
代码布局
缩进
每级缩进用 4 个空格。
括号中使用垂直隐式缩进或使用悬挂缩进。后者应该注意第一行要没有参数,后续行要有缩进。
- Yes
# 对准左括号
foo = long_function_name(var_one, var_two,
var_three, var_four)
# 不对准左括号,但加多一层缩进,以和后面内容区别。
def long_function_name (
var_one, var_two, var_three,
var_four):
print(var_one)
# 悬挂缩进必须加多一层缩进.
foo = long_function_name(
var_one, var_two,
var_three, var_four)
- No
# 不使用垂直对齐时,第一行不能有参数。
foo = long_function_name(var_one, var_two,
var_three, var_four)
# 参数的缩进和后续内容缩进不能区别。
def long_function_name (
var_one, var_two, var_three,
var_four):
print(var_one)
4 个空格的规则是对续行可选的。
# 悬挂缩进不一定是4个空格
foo = long_ function _name(
var_one, var_two,
var_three, var_four)
if 语句跨行时,两个字符关键字 ( 比如 if) 加上一个空格,再加上左括号构成了很好的缩进。后续行暂时没有规定,至少有如下三种格式,建议使用第 3 种。
# 没有额外缩进,不是很好看,个人不推荐.
if (this_is_one_thing and
that_is_another_thing):
do_something()
# 添加注释
if (this_is_one_thing and
that_is_another_thing):
# Since both conditions are true, we can frobnicate.
do_something()
# 额外添加缩进,推荐。
# Add some extra indentation on the conditional continuation line.
if (this_is_one_thing
and that_is_another_thing):
do_something()
右边括号也可以另起一行。有两种格式,建议第 2 种。
# 右括号不回退,个人不推荐
my_list = [
1 , 2 , 3 ,
4 , 5 , 6 ,
]
result = some_function_that_takes_arguments(
'a', 'b', 'c',
'd', 'e', 'f',
)
# 右括号回退
my_list = [
1 , 2 , 3 ,
4 , 5 , 6 ,
]
result = some_function_that_takes_arguments(
'a', 'b', 'c',
'd', 'e', 'f',
)
空格或 Tab?
- 空格是首选的缩进方法。
- Tab 仅仅在已经使用 tab 缩进的代码中为了保持一致性而使用。
- Python 3 中不允许混合使用 Tab 和空格缩进。
- Python 2 的包含空格与 Tab 和空格缩进的应该全部转为空格缩进。
Python2 命令行解释器使用 -t 选项时有非法混合 Tab 和空格的情况会告警。当使用 -tt 警告提升为错误。强烈推荐这些选项!另外个人推荐 pep8 和 autopep8 模块。
最大行宽
限制所有行的最大行宽为 79 字符。
文本长块,比如文档字符串或注释,行长度应限制为 72 个字符。
多数工具默认的续行功能会破坏代码结构,使它更难理解,不推荐使用。但是超过 80 个字符加以提醒是必要的。一些工具可能根本不具备动态换行功能。
一些团队强烈希望更长的行宽。如果能达成一致,可以从从 80 提高到 100 个字符 ( 最多 99 个字符 ) 增加了标称线的长度,不过依旧建议文档字符串和注释保持在 72 的长度。
Python 标准库比较保守,限制行宽 79 个字符 ( 文档字符串 / 注释 72 )。
续行的首选方法是使用小括号、中括号和大括号反斜线仍可能在适当的时候。其次是反斜杠。比如 with 语句中:
with open('/path/ to / some /file/you/want/ to / read ') as file_1, \
open('/path/ to / some /file/being/written', 'w') as file_2:
file_2. write (file_1. read ())
类似的还有 assert 。
注意续行要尽量不影响可读性。比如通常在二元运算符之后续行:
class Rectangle (Blob):
def __init__ (self, width, height,
color= 'black' , emphasis=None, highlight= 0 ):
if (width == 0 and