一 PEP8规范是什么?
PEP是Python Enhancement Proposal的缩写,通常翻译为“Python增强提案”。
每个PEP都是一份为Python社区提供的指导Python往更好的方向发展的技术文档,其中的第8号增强提案(PEP 8)是针对Python语言编订的代码风格指南。
尽管我们可以在保证语法没有问题的前提下随意书写Python代码,但是在实际开发中,采用一致的风格书写出可读性强的代码是每个专业的程序员应该做到的事情,也是每个公司的编程规范中会提出的要求,这些在多人协作开发一个项目(团队开发)的时候显得尤为重要。
官网Python代码样式指南:https://www.python.org/dev/peps/pep-0008/
一 .代码布局
1、使用空格来表示缩进而不要用制表符(Tab)。这一点对习惯了其他编程语言的人来说简直觉得不可理喻,因为绝大多数的程序员都会用Tab来表示缩进,但是要知道Python并没有像C/C++或Java那样的用花括号来构造一个代码块的语法,在Python中分支和循环结构都使用缩进来表示哪些代码属于同一个级别,鉴于此Python代码对缩进以及缩进宽度的依赖比其他很多语言都强得多。在不同的编辑器中,Tab的宽度可能是2、4或8个字符,甚至是其他更离谱的值,用Tab来表示缩进对Python代码来说可能是一场灾难。
2、和语法相关的每一层缩进都用4个空格来表示。
3、每行的字符数不要超过79个字符,如果表达式因太长而占据了多行,除了首行之外的其余各行都应该在正常的缩进宽度上再加上4个空格。
4、函数和类的定义,代码前后都要用两个空行进行分隔。
5、在同一个类中,各个方法之间应该用一个空行进行分隔。
6、二元运算符的左右两侧应该保留一个空格,而且只要一个空格就好。
2.2 标识符命名
PEP 8倡导用不同的命名风格来命名Python中不同的标识符,以便在阅读代码时能够通过标识符的名称来确定该标识符在Python中扮演了怎样的角色(在这一点上,Python自己的内置模块以及某些第三方模块都做得并不是很好)。
1、变量、函数和属性应该使用小写字母来拼写,如果有多个单词就使用下划线进行连接。
2、类中受保护的实例属性,应该以一个下划线开头。
3、类中私有的实例属性,应该以两个下划线开头。
4、类和异常的命名,应该每个单词首字母大写。
5、模块级别的常量,应该采用全大写字母,如果有多个单词就用下划线进行连接。
6、类的实例方法,应该把第一个参数命名为self以表示对象自身。
7、类的类方法,应该把第一个参数命名为cls以表示该类自身。
2.3 表达式和语句
1、采用内联形式的否定词,而不要把否定词放在整个表达式的前面。例如if a is not b就比if not a is b更容易让人理解。
2、不要用检查长度的方式来判断字符串、列表等是否为None或者没有元素,应该用if not x这样的写法来检查它。
3、就算if分支、for循环、except异常捕获等中只有一行代码,也不要将代码和if、for、except等写在一起,分开写才会让代码更清晰。
4、import语句总是放在文件开头的地方。
5、引入模块的时候,from math import sqrt比import math更好。
6、如果有多个import语句,应该将其分为三部分,从上到下分别是Python标准模块、第三方模块和自定义模块,每个部分内部应该按照模块名称的字母表顺序来排列。
1.1 缩进
行长度补充说明:
长的导入模块语句
注释里的URL
不要使用反斜杠连接行.
Python会将 圆括号, 中括号和花括号中的行隐式的连接起来 , 你可以利用这个特点. 如果需要, 你可以在表达式外围增加一对额外的圆括号.
Yes: foo_bar(self, width, height, color='black', design=None, x='foo',
emphasis=None, highlight=0)
if (width == 0 and height == 0 and
color == 'red' and emphasis == 'strong'):
如果一个文本字符串在一行放不下, 可以使用圆括号来实现隐式行连接:
x = ('This will build a very long long '
'long long long long long long string')
在注释中,如果必要,将长的URL放在一行上
Yes: # See details at
# http://www.example.com/us/developer/documentation/api/content/v2.0/csv_file_name_extension_full_specification.html
1.2 表达式和语句中的空格
在二元操作符两边都加上一个空格, 比如赋值(=), 比较(==, <, >, !=, <>, <=, >=, in, not in, is, is not), 布尔(and, or, not). 至于算术操作符两边的空格该如何使用, 需要你自己好好判断. 不过两侧务必要保持一致.
(1)在二元算术、逻辑运算符前后加空格,如:
示例:
a = b + c
if a and b:
pass
当’=’用于指示关键字参数或默认参数值时, 不要在其两侧使用空格.
Yes: def complex(real, imag=0.0): return magic(r=real, i=imag)
(2)在一元前缀运算符后不加空格,如:
示例:
if !flg:
pass
(3)“:”用在行尾时前后皆不加空格,如分支、循环、函数和类定义语言;用在非行尾时后端加空格,如dict对象的定义:
示例:
d = {'key': 'value'}
(4)括号(含圆括号、方括号和花括号)前后不加空格,不要在逗号, 分号, 冒号前面加空格, 但应该在它们后面加(除了在行尾) 如:
示例:
do_something(arg1, arg2)
dict['key'] = list[index]
1.3 行的最大长度
每行的最大长度不得超过80个字符的标准。超过80个字符的,建议使用以下方式将单个长行折叠成多个短行:
(1)为长变量名换一个短名,如:
错误写法:
this.is.a.very.long.variable_name = this.is.another.long.variable_name
正确写法:
variable_name1 = this.is.a.very.long.variable_name
variable_name2 = this.is.another.variable_na