Python学习笔记:PEP8常用编程规范
pep8编码规范是一种非常优秀的编码规范,也得到了python程序员的普遍认可,如果实践中或者项目中没有统一的编码规范,建议尽量遵循pep8编码规范,当然如果项目中已经有了自身的编码规范,应当优先遵循自身的编码规范,哪怕原先的代码风格在你看来很糟糕,也要尽量与源代码风格保持一致。
原文地址:https://blog.csdn.net/ratsniper/article/details/78954852,原文很详细,有代码示例和更多讲解,如果有足够时间,建议阅读原文,这篇笔记只是根据此文来整理了一些常用的点。
一、缩进和对齐
1.语法缩进:语法上的缩进使用4个空格(参数对齐等不一定要用4个空格),不要混用制表符与空格,python2程序在命令行运行时,使用-t可以发出制表符与空格混用的警告,而使用-tt就会使这些警告变成错误提示了
2.行宽:代码行宽限制在79个字符(也可以是99个字符),文档和注释限制在72个字符
3.对齐:当圆括号、方括号和花括号中的元素需要换行时,元素应该垂直对齐,而且如果下一条语句需要缩进时,比如if的条件语句和要执行的代码块,这些换行的元素应该使用更多的缩进来区分下面的缩进
4.换行:代码换行时应该优先使用圆括号、方括号和花括号中的隐式续行,视情况使用反斜杠\来进行换行
5.二元运算符:在二元云算法的换行时推荐以二元运算符作为新行的开始
6.多条语句同行:即使是简单的语句,即使可以使用分号,但是不推荐写在同一行,比如再简单的if/for/while语句也应该分行写
二、空行
1.*定义:*函数和类定义的前后使用两个空行隔开
2.类方法:类中方法的定义使用一个空行隔开
3.逻辑分段:函数中的功能组和逻辑段使用空行来隔开(视情况灵活运用)
三、import语句
1.import *和from xxx import *:这种通配符星号的用法应该尽量避免使用
2.import xxx:这种语句有多个时,应该分开导入,不推荐使用import xxx, yyy
3.from xxx import x, xx:这种形式可以一次导入多个而不用分行
4.普通导入:导入应该在文档字符串和注释之后,在全局变量和常量定义之前
5.导入顺序:导入顺序应该是标准库,三方库,以及本地模块,且需要加空行分隔
6.导入路径:导入应该尽量使用绝对路径,或使用显式的相对路径也是可行的(如:from . import xxx),尽量避免隐式的相对路径
7.双下划线变量导入:在像__version__、__author__等模块级变量的导入应该在文档和注释之后,在import语句之前
四、空格
1.括号等之后的空格:避免紧跟在括号、中括号和大括号之后的空格,例如:func( list_[ 1 ], { 'age': 18 })。应该省去不必要的空格func(list_[1], {'age': 18})
2.逗号等之前的空格:避免紧跟在逗号、分号和冒号之前的空格,例如:a , b = b , a。应该省去不必要的空格a, b = b, a
3.切片中的空格:切片的冒号左右两边应该有相同的空格,切片的下标如果是数字或变量,建议冒号两边不用空格,如果下标是多个变量的表达式或者函数表达式,则建议冒号两边使用一个空格分隔
4.行尾的空格:避免在行尾添加空格,比如在换行符反斜杠\后有空格的话,那这个反斜杠\就不是换行符了,因为行尾是空格而不是反斜杠\
5.二元运算符:除了函数传参和函数指定默认值等特殊情况外,应该总是在二元运算符的两边添加一个空格,如果一个表达式有多个二元运算符(如:+-*/),那么高优先级的二元运算符两边不用空格,低优先级两边添加一个空格,如:x = a*b + c/d
五、注释
1.修改注释:修改代码时一定修改对应的注释,千万不要留下与代码不对应的,甚至是错误的注释,视情况甚至可以删掉注释也不留错误的注释
2.行注释:使用一个#和一个空格开始,并且与注释的代码具有相同缩进,如果需要使用行注释写多段意思的注释,可以使用一个空行注释(即这一行只有一个#)来分隔不同意思的段落
3.代码行之后的注释:应该与前面的代码间隔至少两个空格,然后也是以使用一个#和一个空格开始,但是这种注释应该尽量少用,不必要的话就不用
4.文档注释:应该为所有公共的模块、函数、类和方法编写文档注释,一般使用三个双引号写文档注释,且如果是单行注释,则结尾的三引号应该与注释内容同行,如果是多行注释,则结尾三引号应该单独一行
六、命名
1.旧代码:如果原有的代码与命名规范不一样,应该与原有代码保持一致
2.api:暴露的api或者给别人使用的api应该以使用场景来命名,而不是实现原理命名
3.首字母大写加下划线:这种命名风格不可取,比如capitalized_words_with_underscores
4.单下划线开头:这种命名为弱“内部使用”指示器,即模块内非公有(“protected”),比如在使用from xxx import *语句时是是不会导入单下划线开头的对象的
5.单下划线结尾:这种命名风格是为了避免与python内部关键字冲突的一种约定
6.双下划线开头:当在类中以双下划线开头定义时,调用它的时候会在前面加上“_classname”,如调用类a中的属性__a时,__a就变成了_a__a,这样子类就不可以随便调用这个属性了,可以认为它是“私有”的,但python中没有“私有”的说法,因为依然可以通过a._a__a去访问属性
7.双下划线开头和结尾:为模块和系统级变量,比如__name__、__init__等,我们自己应该永远避免使用这种命名风格
8.单字符变量:永远要使用o(大写的o)、l(小写的l)和i(大写的i),因为有些字体中无法区分它们是数字0和1还是英文字母l和o
9.包名和模板名:使用简短全小写的名称,包名不建议使用下划线,模块名为了提高可读性可以使用下划线
10.c/c++扩展模块:使用c/c++编写的扩展模块需要在模块名称加一个下划线前缀,如:_socket
11.类名:首字母大写
12.异常名:异常一般也是类,所以首字母也是大写,如果异常确实是一个错误,那需要在类名后加上“error”后缀
13.函数名:全小写,为了提高可读性也可以使用下划线,大小写混合的情况只限于为了与原来的代码兼容的情况
14.全局变量:只在模块内使用的全局变量和普通变量一样定义,但是需要注意使用“from xxx import *”的xxx模块中的全局变量应该使用单下划线开头防止内部接口或变量的对外暴露
15.实例变量:非公有方法和实例变量使用单下划线开头(“protected”),双下划线开头会触发python的命名转换规则(在前面加上“_classname”)以避免和子类命名的冲突
16.常量:常量通常是模块级的,使用全大写和下划线配合
七、编程建议
1.字符(串)连接:尽量避免使用如str1 += str2或str1 = str1 + str2的方式连接字符(串),建议使用字符串方法join()方法来连接字符(串)
2.单例对象判断:在于如none这样的单例对象进行判断时,应该使用is none或者is not none来进行判断
3.自定义异常:自定义异常应该继承自exception,而不是baseexception
4.try/except:在try中只填充可能出错的代码,不要一股脑把全部代码放进去
5.return语句:除非函数中没有return语句,如果函数中有return语句,那么在其他可能结束的情况也显示的使用return语句,如果其他情况确实没有值要返回(如运行到了函数结束处,却不需要返回任何值),也要使用return none显示指明
6.startswith/endswith:判断字符串开头前缀或结尾后缀时,使用字符串本身的startswith/endswith,不用字符串的切割来进行判断
7.对象类型的比较:对象类型的比较使用isinstance,而不是type
8.“空”值判断:对于空字符串、空列表、空字典等的判断,直接使用本身来进行布尔值判断,如空字符串使用if str1: pass,而不是if str1 == '': pass