Python 常用 PEP8 编码规范详解
Python常用PEP8编码规范
代码布局
缩进
- 每级缩进用4个空格。
- 括号中使用垂直隐式缩进或使用悬挂缩进。
EXAMPLE:
#(垂直隐式缩进)对准左括号 foo=long_function_name(var_one,var_two, var_three,var_four) #(悬挂缩进)一般情况只需多一层缩进 foo=long_function_name( var_one,var_two, var_three,var_four) #(悬挂缩进)但下面情况,需再加多一层缩进,和后续的语句块区分开来 deflong_function_name( var_one,var_two,var_three, var_four): print(var_one) #右括号回退 my_list=[ 1,2,3, 4,5,6, ] result=some_function_that_takes_arguments( 'a','b','c', 'd','e','f', )
错误示范:
#不使用垂直对齐时,第一行不能有参数。 foo=long_function_name(var_one,var_two, var_three,var_four) #参数的悬挂缩进和后续代码块缩进不能区别。 deflong_function_name( var_one,var_two,var_three, var_four): print(var_one) #右括号不回退,不推荐 my_list=[ 1,2,3, 4,5,6, ] result=some_function_that_takes_arguments( 'a','b','c', 'd','e','f', )
最大行宽
- 每行最大行宽不超过79个字符
- 一般续行可使用反斜杠
- 括号内续行不需要使用反斜杠
EXAMPLE:
#无括号续行,利用反斜杠 withopen('/path/to/some/file/you/want/to/read')asfile_1,\ open('/path/to/some/file/being/written','w')asfile_2: file_2.write(file_1.read()) #括号内续行,尽量在运算符后再续行 classRectangle(Blob): def__init__(self,width,height, color='black',emphasis=None,highlight=0): if(width==0andheight==0and color=='red'andemphasis=='strong'or highlight>100): raiseValueError("sorry,youlose") ifwidth==0andheight==0and(color=='red'or emphasisisNone): raiseValueError("Idon'tthinkso--valuesare%s,%s"% (width,height))
空行
- 两行空行用于分割顶层函数和类的定义
- 单个空行用于分割类定义中的方法
EXAMPLE:
#类的方法定义用单个空行分割,两行空行分割顶层函数和类的定义。 classA(object): defmethod1(): pass defmethod2(): pass defmethod3(): pass
模块导入
- 导入的每个模块应该单独成行
- 导入顺序如下:(各模块类型导入之间要有空行分割,各组里面的模块的顺序按模块首字母自上而下升序排列)
- 标准库
- 相关的第三方库
- 本地库
EXAMPLE:
#按模块首字母排序导入,依此递推 importactive importadidas importcreate
错误示例:
#一行导入多模块 importsys,os,knife #不按首字母导入 importcreate importactive importbeyond
字符串
单引号和双引号作用是一样的,但必须保证成对存在,不能夹杂使用.(建议句子使用双引号,单词使用单引号,但不强制.)
EXAMPLE:
#单引号和双引号效果一样 name='JmilkFan' name="HeyGuys!"
表达式和语句中的空格
括号里边避免空格
EXAMPLE:
spam(ham[1],{eggs:2})
错误示例:
spam(ham[1],{eggs:2})
逗号,冒号,分号之前避免空格
EXAMPLE:
ifx==4:printx,y;x,y=y,x
错误示例:
ifx==4:printx,y;x,y=y,x
函数调用的左括号之前不能有空格
EXAMPLE:
spam(1) dct['key']=lst[index]
错误示例:
spam(1) dct['key']=lst[index]
赋值等操作符前后不能因为对齐而添加多个空格
EXAMPLE:
x=1 y=2 long_variable=3
错误示例:
x=1 y=2 long_variable=3
二元运算符两边放置一个空格
- 涉及=的复合操作符(+=,-=等)
- 比较操作符(==,<,>,!=,<>,<=,>=,in,notin,is,isnot)
- 逻辑操作符(and,or,not)
EXAMPLE:
a=b aorb #括号内的操作符不需要空格 name=get_name(age,sex=None,city=Beijing)
注释
注释块
注释块通常应用在代码前,并和代码有同样的缩进。每行以‘#'开头,而且#后面有单个空格。
EXAMPLE:
#Havetodefinetheparam`args(List)`, #otherwisewillbecapturetheCLIoptionwhenexecute`pythonmanage.pyserver`. #oslo_config:(argsifargsisnotNoneelsesys.argv[1:]) CONF(args=[],default_config_files=[CONFIG_FILE])
单行注释(应避免无谓的注释)
EXAMPLE:
x=x+1#Compensateforborder
文档字符串
EXAMPLE:
#多行文档,首行首字母大写,结尾的"""应该单独成行 """Returnafoobang Optionalplotzsaystofrobnicatethebizbazfirst. """ #单行的文档,结尾的"""在同一行。 """Returnafoobang"""
命名规则
包和模块名:
包和模块名应该简短,全部用小写字母,多字母之间可以使用单下划线连接。
类名:
遵循驼峰命名
classMyClass(object): pass
全局变量名:
全局变量名应尽量只在模块内部使用,对可能使用语句frommoduleNameimportvariableName而被导入的模块,应采用__all__机制来防止全局变量被别的模块导入,或者在全局变量名开头加一个前置下划线.
EXAMPLE:
_name='name'
函数名
函数名应该为全部小写的凹驼峰规则。
EXAMPLE:
vcenter_connection=''
常量名
常量全部使用大写字母的凹驼峰规则来表示,通常在模块顶格定义
EXAMPLE:
MAX_OVERFLOW='' TOTAL=1
方法名和实例变量
非公开方法和实例变量开头使用前置下划线
有时候可能会为了避免与子类命名冲突,采用两个前置下划线
需要注意的是:若classFoo的属性名为__a,该属性是不能以Foo.__a的方式访问的(执著的用户还是可以通过Foo._Foo__a来访问),所以通常双前置下划线仅被用来避免与基类的属性发生命名冲突。
编程建议
None的比较用is或isnot,而不要用==
用isnot代替not…is,前者的可读性更好
EXAMPLE:
#Yes iffooisnotNone #No ifnotfooisNone
使用函数定义关键字def代替lambda赋值给标识符,这样更适合于回调和字符串表示
#Yes deff(x): return2*x #No f=lambdax:2*x
异常类应该继承自Exception,而不是BaseException
Python2中用raiseValueError('message')代替raiseValueError,'message'
(考虑兼容python3和续行的方便性)
捕获异常时尽量指明具体异常,尽量不用exceptException,应该捕获出了什么问题,而不是问题发生
EXAMPLE:
#Yes(捕获具体异常) try: importplatform_specific_module exceptImportError: platform_specific_module=None #No(不要全局捕获) try: importplatform_specific_module except: platform_specific_module=None
try/except子句中的代码要尽可能的少,以免屏蔽掉其他的错误
EXAMPLE:
#Yes try: value=collection[key] exceptKeyError: returnkey_not_found(key) else: returnhandle_value(value) #No try: returnhandle_value(collection[key]) exceptKeyError: #可能会捕捉到handle_value()中的KeyError,而不是collection的 returnkey_not_found(key)
函数或者方法在没有返回值时要明确返回None
#Yes deffoo(): returnNone #No deffoo(): return
使用字符串方法而不是string模块
python2.0以后字符串方法总是更快,而且与Unicode字符串使用了相同的API
使用使用.startswith()和.endswith()代替字符串切片来检查前缀和后缀
startswith()和endswith更简洁,利于减少错误
EXAMPLE:
#Yes iffoo.startswith('bar'): #No iffoo[:3]=='bar':
使用isinstance()代替对象类型的比较
EXAMPLE:
#Yes ifisinstance(obj,int): #No iftype(obj)istype(1):
空序列类型对象的bool为False:
#Yes ifnotseq: pass ifseq: pass #No iflen(seq): pass ifnotlen(seq): pass
不要用==进行bool比较
#Yes ifgreeting: pass #No ifgreeting==True pass ifgreetingisTrue:#Worse pass
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!