Python 代码风格养成记
2018-02-13 本文已影响0人
秦时明星
- 原因:由于代码读取次数比写入次数多得多
代码布局
- 每个缩进级别使用4个空格
#对准左括号
foo = (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)
- 多行结构中的右括号/括号/括号可以排列在列表的最后一行的第一个非空白字符下
my_list = [
1,2,3,
4,5,6,
]
result = some_function_that_takes_arguments(
'a','b','c',
'd','e','f',
)
- 标签或空格
空格是首选的缩进方式,Python3不允许混合使用制表符与空格来缩进。 - 最大线路长度
将所有行限制为最大79个字符,对于较少结构限制(文档字符串或注释)的长文本块,流水线长度应该限制为72个字符。
限制所需的编辑器窗口宽度可以使多个文件并排打开,并且在使用在相邻列中显示两个版本的代码审阅工具时可以很好地工作。 - 导入在单独行
Yes:
import os
import sys
from subprocess import Popen, PIPE
No:
import sys, os
导⼊始终在⽂件的顶部,在模块注释和⽂档字符串之后,在模块全局变 量和常量之前。
导⼊顺序如下:标准库进⼝,相关的第三⽅库,本地库。各组的导⼊之间 要有空⾏。
- 禁止使用通配符导入
通配符导⼊(from import *)应该避免,因为它不清楚命名空间有哪些名称存,
混淆读者和许多⾃动化的⼯具。 - 字符串引⽤
Python中单引号字符串和双引号字符串都是相同的。注意尽量避免在字 符串中的反斜杠以提⾼可读性。
根据PEP 257, 三个引号都使⽤双引号。 - 括号⾥边避免空格
# 括号⾥边避免空格
# Yes
spam(ham[1], {eggs: 2})
# No
spam( ham[ 1 ], { eggs: 2 } )
- 逗号,冒号,分号之前避免空格
# 逗号,冒号,分号之前避免空格
# 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]
# No
ham[lower + offset:upper + offset]
ham[1: 9], ham[1 :9], ham[1:9 :3]
ham[lower : : upper]
ham[ : upper]
- 函数调⽤的左括号之前不能有空格
# Yes
spam(1)
dct['key'] = lst[index]
# No
spam (1)
dct ['key'] = lst [index]
- 赋值等操作符前后不能因为对⻬⽽添加多个空格
#Yes
x = 1
y = 2
long_variable = 3
# No
x = 1
y = 2
long_variable = 3
- ⼆元运算符两边放置⼀个空格
涉及 =、符合操作符 ( += , -=等)、⽐较( == , < , > , != , <> , <= , >= , in , not in , is , is not )、布尔( and , or , not )。
优先级⾼的运算符或操作符的前后不建议有空格。
# Yes
i = i + 1
submitted += 1
x = x*2 - 1
hypot2 = x*x + y*y
c = (a+b) * (a-b)
# No
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)
- 通常不推荐复合语句(多条语句写在 同⼀⾏)
# 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()
- 尽管有时可以在if/for/while 的同⼀⾏跟⼀⼩段代码,但绝不要 跟多个⼦句,并尽量避免换⾏。
# No
if foo == 'blah': do_blah_thing()
for x in lst: total += x
while t < 10: t = delay()
更不是:
# No
if foo == 'blah': do_blah_thing()
else: do_non_blah_thing()
try: something()
finally: cleanup()
do_one(); do_two(); do_three(long, argument,
list, like, this)
- 避免采⽤的名字
决不要⽤字符'l'(⼩写字⺟el),'O'(⼤写字⺟oh),或 'I'(⼤写字⺟eye) 作为单个 字符的变量名。⼀些字体中,这些字符不能与数字1和0区别。⽤'L' 代 替'l'时。 - 包和模块名
模块名要简短,全部⽤⼩写字⺟,可使⽤下划线以提⾼可读性。包名和模块 名类似,但不推荐使⽤下划线。