Python中PEP8规范说明
PEP8是Python的编码规范,其中⼼在于提⾼代码的可读性
当然也需要根据实际业务考量:
1.如果遵循反⽽可读性降低。
2.因为历史原因等,遵循后与其他代码的规范不⼀样(当然也是⼀个去收拾别⼈的烂摊⼦的机会)。
(所以编码的时候越是遵循规范,越会⽅便别⼈提⾼⾃⼰)
规范条例:
1.代码排版
a.保持每⾏缩进使⽤4个空格
注释:不能混⽤tab和空格,默认会全部转换为空格
b.⼀⾏的最⼤长度为79个字符,(⽂档字符串或注释不超过72个字符)
注释:窗⼝显⽰限制,默认换⾏会打断代码结构
c.换⾏⾸选括号,再是反斜杠。换⾏点在操作符后敲回车
d.顶层函数与类之间空两⾏,类⽅法之间空⼀⾏,函数内部不同逻辑段之间空⼀⾏
2.⽂档排版
a.Py2中默认编码ASCII或Latin-1,Py3中默认为UTF-8
b.import导⼊时单独分开导⼊,from xx import xx,xx 可以多个导⼊
c.导⼊位于⽂件的顶部:在模块注释和⽂档字符后,全局变量和常量前
d.导⼊顺序:标准库 、 相关第三⽅库 、 本地库/⾃定义库,之间空⼀⾏,并配置相关的__all__说明书
e.包导⼊时:尽量使⽤绝对路径,移植性和阅读性更⾼
3.避免多余空格
a.各种括号前不加空格
b.逗号、分号或冒号前不加空格
c.函数调⽤的参数列表的圆括号的开括号前,text(1)
d.索引或切⽚的⽅括号的开括号前,list[1]
e.在复制或其他语句的运算符周围,不要为了对齐使⽤多个空格
f.算数运算符前后加空格:1 * 3
g.不在⼀个关键字参数或⼀个缺省参数值的 = 前后加⼀个空格:def text(real, imag=0)
h.通常不推荐使⽤复合语句(⼀⾏多语句)
i.if/for/while 块中,执⾏语句必须另起⼀⾏
4.注释
python的try和except用法不好理解的注释,不如没有注释。
如果是⼀个短语或句⼦,⾸字母⼤写(除标识符),以句号结尾,并且有两个空格
使⽤英语注释,因为不同编码或其他等原因,中⽂容易出现乱码
a.块注释:在⼀段代码前增加,以 # 开头跟⼀个空格。段落以# 的单⾏分隔
# Description : this is text
#
# Input : text
b.⾏内注释:与语句间隔两个空格,起始于 #和⼀个空格
x = x+y # this is text
c.⽂档字符串:对于模块,函数,类和⽅法进⾏注释说明,位于def ⾏之后
""" text()
this is text()
"""
d.版本注记:有Subversion、CVS、RCS等,在块注释后,其他代码之前,前后⼀个空⾏
__version__ = "$Reviseson: asdqwe $"
# $Source$
5.命名风格
a.⼤⼩写字母和下划线组成
b.⾸字母⼤写缩进:所有字符⽤⼤写,HTTPServerError
c.单下划线开始:表⽰内部使⽤的⽅法,不建议修改
d.单下划线结束:⽤于避免与Python关键字或⽅法冲突
e.双下划线开始:定义类中的属性,不能直接通过类名进⾏调取,⽽是类⽅法获取,或者是类名._类名__属性名进⾏获取,(⼀般不推荐使⽤)
f.双下划线开始结束:永远不要⾃定义该类型的⽅法,⽤于内部的魔法⽅法
6.命名规范
a.特别注意"l"(⼩写l)、"I"(⼤写i)、"1"(数字1)、"0"(数字0),"O"(⼤写o),不作为单个变量名
b.模块名:全⼩写并简短,可以使⽤下滑线
c.包名:全⼩写并简短,不建议下滑线
d.类名:⾸字母⼤写。内部类加上前导下划线
e.异常名:沿⽤类名规则并以"Error"为前缀
f.全局变量名:尽量只在模块内有效。实现为__all__或者是前缀⼀个下划线
g.函数名:⼩写,可⽤下划线分隔
h.⽅法名和实例变量:下划线分隔的⼩写字母,私有⽅法和实例变量前⽤单下划线
i.常量:在模块级别定义,全⼤写和下划线分隔
j.类的属性有三种作⽤域public、non-public与subclass API,类似Java中的public、private、protected。non-public属性前,前缀单下划线
k.公有属性和保留字冲突时,在属性后加⼀个下划线,⽐缩写和拼写好
l.如果属性不希望被⼦类继承时,⽤双下滑先开头,可以进⾏避免。但需要注意调取时的命名内容,类名._类名__属性名可以调⽤,或者是⼦类出现相同的类名和属性名,会有冲突
m.类的实例⽅法第⼀参数为self,类⽅法第⼀参数为cls
7.编码建议
a.编码中考虑其他Python实现效率等问题,⽐如运算符'+'进⾏字符串拼接时,在CPython效率⾼,在Jython中⾮常低,所以使
⽤.join()的⽅式
b.在于None⽐较时,使⽤is优于'==',因为在Python中None是固定内存id,所以直接通过is判断效率更⾼
c.使⽤复杂⽐较实现排序时,应⽤__eq__,__ne__,.....等效率更⾼,并且可以通过al_ordering()提供⽣成缺少的⽐较操作⽅法
d.使⽤基于类的异常,每个模块或包都有⾃⼰的异常类,此异常类继承⾃Exception
e.抛出异常使⽤raise,并且捕获异常时不要单独只有except会捕获SystemExit和KeyboardInterrupt异常,使得难以中断并隐藏其他问题,其后续跟具体的异常类型,以及处理⽅式
f.Try/except语句,限制try语句来减少必要代码的数量
try:
value = collection[key]
except KeyError:
return key_not_found(key)
else:
return handle_value(value)
No:
try:
# Too broad!
return handle_value(collection[key])
except KeyError:
# Will also catch KeyError raised by handle_value()
return key_not_found(key)
g.使⽤'.startswith()'和'.endswith()'⽽⾮字符切⽚去检测前缀或后缀
Yes: if foo.startswith('bar'):
No: if foo[:3] == 'bar':
h.对象类型⽐较isinstance()优于type,注:在Python2.3中Unicode和str的基类⼀致 Yes: if isinstance(obj, int):
No: if type(obj) is type(1):
i.判断序列(strings,lists,tuples)
Yes: if not seq:
if seq:
No: if len(seq)
if not len(seq)
j.字符串不以空格结尾
k.判断布尔值时,不使⽤"==",使⽤is
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论