来源 | 异步图书本节收录了稍做剪辑的PEP 8摘要(Python Enhancement Proposal,Python加强提案)。PEP 8由Guido van Rossum和Barry Warsaw撰写,是Python的最接近编程风格手册的东西。这里省略了一些比较具体的部分,但主要内容都已包括。应该尽量让代码遵照PEP 8规范,代码会由此更具Python风格。
访问Python官方网站的文档部分并搜索PEP,就能够得到PEP 8全文及Python历史上发布的全部其余PEP。PEP既是Python历史和经验的绝佳来源,也是当前议题和未来计划的解释。css
!编程
01数组
简介本文档给出的Python编码约定,适用于由Python主发行版本中的标准库构成的代码。有关Python的C实现中的C代码风格指南,参见相应的PEP。本文档改编自Guido最初的Python风格指南文章,并加入了Barry风格指南的一些内容。若是与Guido的风格规则存在冲突,应该听从本PEP。本PEP可能还没有完结(其实可能永远不会完结)。 异步
02编辑器
Guido的一个重要观点是,代码被阅读的次数远多于被编写的次数。本指南旨在提升代码的可读性,使各类各样的Python代码能保持风格一致。正如PEP 20所述,“Readability counts”(注重可读性)。风格指南是讨论一致性的。与风格指南保持一致很重要。维持同一个项目内部的一致性更加剧要。而保证同一个模块和函数内部的一致性则最重要。然而最最重要的是,知道什么时候应打破一致性,有时风格指南并不适用。若是心存疑虑,请采用本身的最佳判断。请看看别人的例子并作出最佳决定。不要犹豫,尽管发出疑问。如下是两个打破规范的好理由。函数
03工具
缩进布局
每级缩进采用4个空格。为了对付那些确实陈旧的代码,又不肯作出清理,那么能够继续沿用8个空格长度的制表符。网站
制表符仍是空格ui
绝对禁止制表符和空格的混用。最流行的Python缩进方式是只使用空格。第二流行的方式是只使用制表符。混合使用制表符和空格进行缩进的代码,应该转换为只使用空格的方式。若是调用Python命令行解释器时带上-t
参数,它就会对非法混用制表符和空格的代码发出警告。若是用了-tt
参数,这些警告就会上升为错误。强烈推荐使用这些参数!对全新的项目而言,强烈建议只用空格缩进,换掉全部的制表符。大部分编辑器都具有将制表符替换为空格的便捷功能。
最大行长
全部行都应限制在79个字符之内。将行长限制在80个字符的设备还有不少,并且将窗口限制为80个字符宽就能够并排放置多个窗口。这些设备上的默认换行会破坏代码的外观,增长理解的难度。所以,请将全部行都限制在79个字符之内。对于连续的大段文字(文档字符串或注释),建议将行长限制在72个字符之内。对长行进行换行的首选方案,是利用Python隐含的行链接特性,在圆括号、方括号和大括号内部进行断行。必要时能够在表达式外面多加一对圆括号,不过有时候用反斜杠会更好看些。请确保对后续行进行适当的缩进。打断二元运算符的首选位置是在运算符以后,而不是运算符以前。下面给出一些例子:
1class Rectangle(Blob):
2 def __init__(self, width, height,
3 color='black', emphasis=None, highlight=0):
4 if (width == 0 and height == 0 and\
5 color == 'red' and emphasis == 'strong' or \
6 highlight > 100):
7 raise ValueError("sorry, you lose")
8 if width == 0 and height == 0 and (color == 'red' or
9 emphasis is None):
10 raise ValueError("I don't think so -- values are %s, %s" %
11 (width, height))
12 Blob.__init__(self, width, height,
13 color, emphasis, highlight)
空行
顶级函数和类定义之间,请用两个空行分隔。类内部的各个方法定义之间,请用1个空行分隔。为了让有关联的函数成组,能够在各函数组之间有节制地添加空行。相互关联的一组单行函数之间,能够省略空行,如一组函数的伪实现(dummy implementation)。函数内部能够有节制地用空行来区分出各个逻辑部分。Python可将Ctrl+L(^L)换页符接受为空白符。不少工具都将其视为分页符,因此能够利用其进行分页,使得文件中的关联部分单独成页。
导入
导入语句一般应单独成行,例如:
1import os
2import sys
不要像下面这样写在一块儿:
1import sys, os
不过下面的写法没有问题:
1from subprocess import Popen, PIPE
导入语句一般位于文件的顶部,紧挨着模块注释和文档字符串后面,在模块全局变量和常量定义以前。
导入语句应按照如下顺序进行分组。(1)标准库的导入。(2)相关第三方库的导入。(3)本地应用程序/库——特定库的导入。每组导入语句之间请加入1个空行。任何对应的__all__
声明都应位于导入语句以后。很是不推荐对内部包的导入使用相对导入语法。请始终对全部导入都使用绝对包路径。即使Python 2.5如今已彻底实现了PEP 328,它的显式相对导入语法也是强烈不推荐的。绝对导入的可移植性更好,一般可读性也会更好。若是是从包含类的模块中导入类,一般能够采用以下写法:
1from myclass import MyClass
2from foo.bar.yourclass import YourClass
若是上述写法会致使本地命名冲突,就采用以下写法:
1import myclass
2import foo.bar.yourclass
而后用myclass.MyClass
和foo.bar.yourclass.YourClass
表示类。
表达式和语句内的空白符
讨厌之事——如下场合应避免使用多余的空白符。
正确:
1spam(ham[1], {eggs: 2})
错误:
1spam( ham[ 1 ], { eggs: 2 } )
正确:
1if x == 4: print x, y; x, y = y, x
错误:
1if x == 4 : print x , y ; x , y = y , x
正确:
1spam(1)
错误:
1spam (1)
正确:
1dict['key'] = list[index]
错误:
1dict ['key'] = list [index]
正确:
1x = 1
2y = 2
3long_variable = 3
错误:
1x = 1
2y = 2
3long_variable = 3
其余建议
始终在如下二元操做符两侧各放1个空格:赋值(=
)、增量赋值(+=
,-=
等)、比较(==
、<
、>
、!=
、<>
、<=
、>=
、in
、not
、in
、is
、is not
)、布尔(and
、or
、not
)。
正确:
1i = i + 1
2submitted += 1
3
4x = x * 2 – 1
5hypot2 = x * x + y * y
6c = (a + b) * (a - b)
错误:
1i=i+1
2submitted +=1
3x = x*2 – 1
4hypot2 = x*x + y*y
5c = (a+b) * (a-b)
=
两边使用空格。正确:
1def complex(real, imag=0.0):
2 return magic(r=real, i=imag)
错误:
1def complex(real, imag = 0.0):
2 return magic(r = real, i = imag)
正确:
1if foo == 'blah':
2 do_blah_thing()
3do_one()
4do_two()
5do_three()
最好不要:
1if foo == 'blah': do_blah_thing()
2do_one(); do_two(); do_three()
if/for/while
放在同一行没什么问题,但多行语句绝对不能如此。同时还要避免过长代码行的折叠!最好不要:
1if foo == 'blah': do_blah_thing()
2for x in lst: total += x
3 while t < 10: t = delay()
绝对不要:
1if foo == 'blah': do_blah_thing()2else: do_non_blah_thing()3try: something()4finally: cleanup()5do_one(); do_two(); do_three(long, argument, 6 list, like, this)7if foo == 'blah': one(); two(); three()