PEP8 编码规范详解
import this 看一下python之禅。
1.缩进
- 用Tab表示缩进是一场灾难
- 和语法相关的每一层缩进用4个空格表示
- 二元运算符左右两侧应当有且只有一个空格
- 表达式内容太多时(不超过79个字符),除了首行外,其他各行应当缩进
Yes:首行有参数,第二行与首行左括号对齐
foo = long_function_name(var_one,var_two,
var_three,var_four)
Yes:首行无参数,第二行添加4个额外的4个空格缩进,与其余部分区分
def long_function_name(
var_one,var_two,var_three,
var_four):
print(var_one)
Yes:
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)
NO:参数额外缩进4个空格,易混淆,可读性差
def long_function_name(
var_one,var_two,var_three,
var_four):
print(var_one)
-
当运算符表达式过长时,运算符和其后的操作数一同换行,易于将运算符和操作数匹配
income = (gross_wages
+ taxable_interest
+ (dividends - qualified_dividends)
- ira_deduction
- student_loan_interest)
2.空白行
- 通常在函数末尾或者类定义末尾增加空白行
3.引号
- python中单引号和双引号是相同的,可以选择一个规则使用。
- 同一字符串中包含了双重引号时,应当使用不同的隐含,避免出现反斜杠,提高可读性
4.避免不必要空格
Yes: spam(ham[1], {eggs: 2})
No: spam( ham[ 1 ], { eggs: 2 } )
Yes: foo = (0,)
No: bar = (0, )
Yes: if x == 4: print x, y; x, y = y, x
No: if x == 4 : print x , y ; x , y = y , x
-
切片操作符冒号左右左右两侧空格应该对称
-
省略某一参数时,空格也应当省略
Yes:ham[1:9], ham[1:9:3], ham[:9:3], ham[1::3]
No:ham[1: 9], ham[1 :9], ham[1:9 :3]
Yes:
y = 2
long_variable = 3
No:
y = 2
long_variable = 3
-
避免在行末尾增加空格,不可见,让人困惑
-
二元运算法两边始终保留一个空格:赋值assignment (=), 扩展赋值augmented assignment (+=, -= etc.), 比较comparisons (==, <, >, !=, <>, <=, >=, in, not in, is, is not), 布尔运算 (and, or, not),注意,高级运算级通常两侧没有空格,如乘、除、乘方、取余等
-
当包括优先级不同的运算符时,仅在低优先级运算符号两侧增加空格
-
如果有多个
import
语句,应该将其分为三部分,从上到下分别是Python标准模块、第三方模块和自定义模块,每个部分内部应该按照模块名称的字母表顺序来排列。Yes:
i = i + 1
q += 1
x = x*2 + X**3 + 1
c = (a+b) * (a-b)
No:
i=i+1
x = x * 2 - 1
- 用于指示关键字参数时,或者用于确定关键字参数默认值时,=两侧不加空格
Yes:
def complex(real,imag=0.0):
return magic(r=real,i=imag)
No:
def complex(real, imag = 0.0):
return magic(r = real, i = imag)
-
避免在同一行内有复合表达式,应当在:末尾换行。分开两行更清晰
Yes:if foo == 'blah': do_blah_thing() do_one() do_two() do_three()
No:
if foo == 'blah': do_blah_thing()
do_one(); do_two(); do_three()
5.注释
- 和代码相矛盾的注释,不如没有注释
- 在修改代码时,首先应当修改注释
- 尽量用英语注释,养成好习惯
6.命名规范
- 不要使用小写l,大写O,单字母表述容易混淆
- 类的命名应当首字母大写,函数名称应当小写,可以使用下划线分割增加可读性
- 函数第一个参数应当始终是self
- 函数名与关键字重复时,在函数名后加_
- 常量全部大写,使用下划线分割
7.函数返回值
- 函数应当标明return语句,return None不可以省略None
Yes:
def foo(x):
if x >= 0:
return math.sqrt(x)
else:
return None
def bar(x):
if x < 0:
return None
return math.sqrt(x)
No:
def foo(x):
if x >= 0:
return math.sqrt(x)
def bar(x):
if x < 0:
return
return math.sqrt(x)
- 使用startswith()和endswith()检查前后缀,不要用字符串切片
- 使用isinstance()检查某对象类型
- 检查是否为空,应当用if seq,不使用if len(seq)==0,即不要用验证长度的方法检查是否为空
翻译整理自官方文档:https://www.python.org/dev/peps/pep-0008/#a-foolish-consistency-is-the-hobgoblin-of-little-minds