PEP8 python编码规范

代码要可维护、可扩展、可被人阅读;自己要形成自己的代码规范,统一风格。PEP8是python作者写的一份python代码规范指南安装PEP8检查程序:

pip install pycodestyle

pycodestyle xxxx.py使用IDE:pycharm(默认检查)

代码布局

每一级缩进使用四个空格

python使用严格的代码缩进方式分隔代码块

制表符只能用于与同样使用制表符缩进的代码保持一致

不允许同时使用空格和制表符缩进

所有行限制的最大字符数79,文档或注释等没有结构化限制的大块文本行最大限制字符数72,太长可换行,括号里的直接回车换行,符号跟下行,上下对其;字符串中\ 换行,上下对其。

文档说明 空一行 引用包 空两行定义类和函数 类里面方法间空一行,变量赋值和导入声明之间插入空行,分割语义

分行导入不同的包,同一个包不同方法同行导入;避免使用通配符*导入;

函数名和后面的()之间不要加空格;:之前不要加空格;()内的参数之间可以在,之后加空格;=等二元运算符前后加空格;制定关键字参数或者默认参数值的时候,= 附近不加空格。

命名规范

那些暴漏给用户的API接口的命名,应该遵循反映使用场景而不是实现的原则

使用英文单词命名,不要使用拼音和简拼

不要害怕过长的命名变量,越清楚越好

避免重复使用变量名表示不同对象

不能使用内建名称

避免使用大小写区分不同对象

使用下划线分割小写单词提高可读性

大写字母单词来表示常量

驼峰命名法 缩写全部大写

包名全部小写;类名首字母大写;函数名小写;

注释

当代码更改时优先更改注释

尽量使用英文写注释

句尾结束时应该使用两个空格块注释 ‘’‘ 对一段代码进行的注释 与代码在不同的行’‘’ ####

行注释 # 与代码在同一行的

文章注释 ‘’‘ 函数或者文件下面的详细解释 ’‘’

有节制的使用行注释,否则使用块注释

为所有公共模块,函数编写文档说明,文档说明要描述方法的功能、对参数、返回值和可能的异常进行说明

仅仅注释不是一目了然的,难以理解的代码进行注释,注释用来解释代码的功能、原因和想法,不是对代码本身的解释;不需要的代码直接删除,成熟代码不要有注释代码

惯用原则采用内联形式的否定词,而不要把否定词放在整个表达式的前面。例如if a is not b就比if not a is b更容易让人理解。

不要用检查长度的方式来判断字符串、列表等是否为None或者没有元素,应该用if not x这样的写法来检查它。

就算if分支、for循环、except异常捕获等中只有一行代码,也不要将代码和if、for、except等写在一起,分开写才会让代码更清晰。

import语句总是放在文件开头的地方。

引入模块的时候,from math import sqrt比import math更好。

如果有多个import语句,应该将其分为三部分,从上到下分别是Python标准模块、第三方模块和自定义模块,每个部分内部应该按照模块名称的字母表顺序来排列。

变量、函数和属性应该使用小写字母来拼写,如果有多个单词就使用下划线进行连接。

类中受保护的实例属性,应该以一个下划线开头。

类中私有的实例属性,应该以两个下划线开头。

类和异常的命名,应该每个单词首字母大写。

模块级别的常量,应该采用全大写字母,如果有多个单词就用下划线进行连接。

类的实例方法,应该把第一个参数命名为self以表示对象自身。

类的类方法,应该把第一个参数命名为cls以表示该类自身。

编码建议

编码中考虑到其他python实现的效率等问题,比如运算符‘+’在CPython(Python)中效率高,但是Jython中却非常低,所以应该采用.join()的方式

尽可能使用‘is’‘is not’取代‘==’,比如if x is not None 要优于if x

使用基于类的异常,每个模块或包都有自己的异常类,此异常类继承自Exception

异常中不要使用裸露的except,except后跟具体的exceptions

异常中try的代码尽可能少

使用startswith() and endswith()代替切片进行序列前缀或后缀的检查。比如

Yes: if foo.startswith(‘bar’):优于
No: if foo[:3] == ‘bar’:

使用isinstance()比较对象的类型。比如

Yes: if isinstance(obj, int): 优于
No: if type(obj) is type(1):

判断序列空或不空,有如下规则

Yes: if not seq:
if seq:

优于

No: if len(seq)
if not len(seq)

字符串不要以空格收尾

二进制数据判断使用 if boolvalue的方式