再读PEP8
好久好久没有写代码了,PEP8已经快忘得一干二净。重新读一遍,然后记录下来。
一、代码布局
1.缩进
每个缩进都使用四个空格, 连续行的原则是要和下一行在观感上有明显的区分。
连续行应该和对应的括号垂直对齐
# GOOD
foo = long_function_name(var_one, var_two,
var_three, var_four)
# BAD!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
foo = long_function_name(var_one, var_two,
var_three, var_four)
或者在前面添加空格来和下一行区分
# GOOD
def long_function_name(
var_one, var_two, var_three,
var_four):
print(var_one)
# BAD!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
def long_function_name(
var_one, var_two, var_three,
var_four):
print(var_one)
永远不要用tab缩进,如果用vim的话,在参数中记得加入,vim会自动把tab拆分成空格,现在大多文本编辑器和IDE都会支持这个功能。
set shiftwidth=4
2. 行字符限制
每行最大字符数不超过79,但是一些团队会要求更长的限制,以便于代码阅读和维护。但是注释长度最好不要超过限制。
正确的运算符断行
income = (gross_wages
+ taxable_interest
+ (dividends - qualified_dividends)
- ira_deduction
- student_loan_interest)
3. 关于空行
顶级函数和类的周围要有两个空行
类中的方法周围要有一个空行
使用空行来分割逻辑块
4.文件编码
文件编码:
python内核文件中始终使用UTF-8编码
使用ASCII(python2) 和UTF-8(python3)不需要声明
5.import模块
如何Import 模块
不要一下导入两个模块
模块导入永远放在文件开头,紧接着模块注释和docstring
模块导入顺序如下:
1.标准库导入
2.第三方模块导入
3.本地模块导入
Yes: import os
import sys
from subprocess import Popen, PIPE
No: import sys, os
二、字符串引号
不要混用单引号和双引号,保持一个习惯,要么一直用单引号,要么一直用双引号。
三引号字符串,总是使用双引号
三引号字符串,总是使用双引号
三引号字符串,总是使用双引号
三、表达式和语句中的空格
1.最烦人的怪癖
请避免以下情况的空格:
紧跟大小括号之后的空格
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], ham[1:9:]
ham[lower:upper], ham[lower:upper:], ham[lower::step]
ham[lower+offset : upper+offset]
ham[: upper_fn(x) : step_fn(x)], ham[:: step_fn(x)]
ham[lower + offset : upper + offset]
函数,字典的括号前面不要加空格
Yes: spam(1)
No: spam (1)
Yes: dct['key'] = lst[index]
No: dct ['key'] = lst [index]
二元运算符,左右各一个
YES
x = 1
y = 2
long_variable = 3
NO:
x = 1
y = 2
long_variable = 3
保证代码可读性为主
YES
i = i + 1
submitted += 1
x = x*2 - 1
hypot2 = x*x + y*y
c = (a+b) * (a-b)
传参等号不要加空格(有时候会报错)
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)
别把代码塞到一行
NO:
if foo == 'blah': do_blah_thing()
do_one(); do_two(); do_three()
四、注释
时刻保证在代码改变的时候,优先修改注释!!!
注释应该是完整的句子,开头字母大写。除非开头是一个小写字母开头的标识符
在多句子的注释中,每一句结尾都应该有两个空格。除非是最后一句。
一定要用英文编写注释!!!!除非你百分之120确信你的代码不会被其他语言者阅读。
1.块注释
每一行用 # 加一个空格开始
2.行内注释
请保守的使用行内注释,如果不是十分必要不要乱加。看着乱。
3.文档字符串(Document String)
结束的三引号另起一行,如果是单行字符串就不必另起一行。
五、命名约定(Naming Convention)
1.避免出现的命名
永远不要用大写i和小写L,还有大写O作为变量名称。
2.包和模块的命名
小写,如果有必要可以加下划线增加可读性
3.类的命名
每个单词开头字母大写,比如CapWords
4. Exception类的命名
遵从类的命名规则,最后要加一个Error后缀
5.函数和变量命名
函数名小写,除非你所在的组织历史遗留的风格是mixedStyle这种风格的,不然不要这么用。当然,如果加下划线能够增加可读性可以加。
6.常量
常量全部大写,可加下划线,比如MY_CONSTANTS
六、一些编程的建议
用is not 替换not is
# YES
if foo is not None:
# NO
if foo not is None:
用def 定义简单函数而不是lambda
# YES
def f(x): return 2*x
# NO
f = lambda x: 2*x
保持return 的一致性
# Yes
def foo(x):
if x >= 0:
return math.sqrt(x)
else:
return None
# No
def foo(x):
if x >= 0:
return math.sqrt(x)
使用.startswith() 和 .endswith()来检查开头和结尾,避免使用切片检查。