目录
简介
PEP 8 Style Guide for Python Code,即Python代码样式指南,或者说python编码规范。本文对文档进行了筛选与汉化,由于并不是完全复制到百度或谷歌进行翻译(这样也没啥意思),所以并不全,目录也根据个人理解(尽量从python文件的上方到下方)有所改变,英文好的可以直接看官网。红色的是个人认为应该遵守的,其余的看习惯吧。
文件编码
核心Python发行版中的代码应该始终使用UTF-8(Python 2中使用ASCII)。
代码布局
导入库函数
导入始终放在文件顶部,紧随任何模块之后 注释和文档字符串,以及模块全局变量和常量之前。
导入应按以下顺序进行:
- 标准库导入
- 有关的第三方库进口
- 本地应用程序/库特定的导入
若是导入多个库函数,应该分开依次导入:
import os
import sys
应避免使用通配符导入(from xxx import *)
缩进
每个缩进级别4个空格,建议使用IDE自带的,比如Pycharm。
建议不使用制表符(Tab),不要混用制表符和空格!!!
行长度
每行最大长度
79字符
,换行可以使用反斜杠,最好使用圆括号,IDE中一般Enter会自动添加。
文档字符串或注释
,行长应限制为
72 字符
。
一般过长,IDE会提示。
有二元操作符时应在操作符前换行
# Correct:
# easy to match operators with operands
income = (gross_wages
+ taxable_interest
+ (dividends - qualified_dividends)
- ira_deduction
- student_loan_interest)
# Wrong:
# operators sit far away from their operands
income = (gross_wages +
taxable_interest +
(dividends - qualified_dividends) -
ira_deduction -
student_loan_interest)
空行
用
两个空白行
分隔
顶层函数和类定义
。
用
一个空行
分隔
类中的方法
定义。
可以使用额外的空白行(节省空间)来分隔相关功能组。在一堆相关的单行程序(例如,一组虚拟执行程序)之间可能会省略空白行。
在函数中使用空行来节省逻辑部分。
恰当的使用空白行可以提高代码的可读性。
字符串
在Python中,单引号字符串和双引号字符串是相同的。PEP没有对此做建议。
个人建议使用双引号来包含长度大于1的字符串,使用单引号来包含长度为1的字符串
,与其他语言一致(博主用Python一段时间,等用C++时有时就对字符串使用单引号,然后出错)。如果字符串中存在单引号或双引号,字符串可使用另一个来包含,尽量避免转义(反斜杠)。
表达式和语句中的空白
避免空格
在以下情况下避免无关的空格
在括号或大括号内
# Correct:
spam(ham[1], {eggs: 2})
# Wrong:
spam( ham[ 1 ], { eggs: 2 } )
在尾随逗号和后面的右括号之间
# Correct:
foo = (0,)
# Wrong:
bar = (0, )
在逗号,分号或冒号前面
# Correct:
if x == 4: print x, y; x, y = y, x
# Wrong:
if x == 4 : print x , y ; x , y = y , x
紧接在开始函数调用的参数列表的开括号之前
# Correct:
spam(1)
# Wrong:
spam (1)
紧接在开始括号之前,开始索引或切片
# Correct:
dct['key'] = lst[index]
# Wrong:
dct ['key'] = lst [index]
在一个赋值(或其他)运算符周围用多于一个的空格来对齐它
# Correct:
x = 1
y = 2
long_variable = 3
# Wrong:
x = 1
y = 2
long_variable = 3
其他
避免在任何地方尾随空格
总是围绕这些二元运算符在两侧使用一个空格
=
+=, -=,*=, /=
==, <, >, !=, <>, <=, >=, in, not in, is, is not
and, or, not
如果使用优先级不同的运算符,请考虑添加优先级最低的运算符周围的空白,有括号时可考虑括号外添加。
# Correct:
i = i + 1
submitted += 1
x = x*2 - 1
hypot2 = x*x + y*y
c = (a+b) * (a-b)
# Wrong:
i=i+1
submitted +=1
x = x * 2 - 1
hypot2 = x * x + y * y
c = (a + b) * (a - b)
函数注释应使用冒号和空格,如果存在->,->两侧应该有空格
# Correct:
def munge(input: AnyStr): ...
def munge() -> PosInt: ...
# Wrong:
def munge(input:AnyStr): ...
def munge()->PosInt: ...
表示关键字参数或默认值时不必添加空格
# Correct:
def complex(real, imag=0.0):
return magic(r=real, i=imag)
# Wrong:
def complex(real, imag = 0.0):
return magic(r = real, i = imag)
注释
代码更改时,相应的注释也要随之更改
块注释
通常由一个或多个段落组成完整的句子,每个句子以句号结尾
行注释
行注释用#和一个空格开始,一般在代码的上一行,如果代码较短,又很重要,可以与代码一行,建议与代码空两个空格
flag = true # set flag to true, so there is no border problem
文档字符串
常用
三个双引号作文档字符串
,文档字符串常用在模块的开端用以说明模块的基本功能,或紧跟函数定义的后面用以说明函数的基本功能,参数,返回值。
函数注释
第一行说明函数的作用,接下来是函数的参数、函数的返回值。pycharm中函数后打三双引号即可自动添加。
def plus(a,b):
"""
compute a+b and return result
:param a: int, a number
:param b: int, another number
:return: int, a+b
"""
命名规范
采用描述性的命名规则
例如一个实现某种功能的类或函数,那这个类或函数的名字就以相应的功能实现作为命名,简单易懂。
类的命名采用驼峰命名法
每个单词的首字母大写。由于python官方还存在tuple、SystemExit等混用的情况,个人认为这里暂时没必要。
避免使用的名称
切勿将字符’l’(小写字母el),’O’(大写字母oh)或’I’(大写字母i)作为单个字符变量名称。在一些字体中,这些字符与数字1和零是无法区分的。当试图使用“l”时,请使用“L”。
软件包/模块名称
建议使用简短的全小写名称,不建议特别长,实在不行就使用下划线。
函数名称
应该是小写的,为了提高可读性,必须使用由下划线分隔的单词。如果函数参数的名称与保留关键字冲突,通常最好追加一个尾部下划线,而不是使用缩写或拼写损坏。
函数/方法参数
始终将 self 作为实例方法的第一个参数。
始终 使用 cls 作为类方法的第一个参数 。
常量
常量通常在模块级别定义,并全部写入带下划线的大写字母。 例子包括 MAX_OVERFLOW 和 TOTAL 。
编程建议
字符串
不建议使用+进行字符串连接,这个的优化不好。建议使用”.join()。
使用startwith/endwith判断前后缀,而不是==与切片[]
# Correct:
if foo.startswith('bar'):
# Wrong:
if foo[:3] == 'bar':
布尔判断
与单例(例如,None)比较,请使用is 或者 is not进行判断,而不是==。内部区别是使用id还是__eq__,__eq__可覆盖。
# Correct:
if foo is not None:
# Wrong:
if foo == None:
不要在条件语句中使用==比较bool值和True或False
# Correct:
if greeting:
# Wrong:
if greeting == True:
函数
没有用到self的方法放到类外作为函数。
确保每个return语句都能有返回值,不能返回的应显式的返回None。
# Correct:
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)
# Wrong:
def foo(x):
if x >= 0:
return math.sqrt(x)
def bar(x):
if x < 0:
return
return math.sqrt(x)
异常
从Exception派生,而不是BaseException。
try语句中尽量包含更少的代码,避免掩盖错误。
# Correct:
try:
value = collection[key]
except KeyError:
return key_not_found(key)
else:
return handle_value(value)
# Wrong:
try:
# Too broad!
return handle_value(collection[key])
except KeyError:
# Will also catch KeyError raised by handle_value()
return key_not_found(key)
更多python相关内容:
【python总结】python学习框架梳理
本人b站账号:
lady_killer9
有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。如果您感觉有所收获,自愿打赏,可选择支付宝18833895206(小于),您的支持是我不断更新的动力。