不要在行末尾加分号,也不要用分号将两条命令放在一行。
行长度
每行不要超过80个字符。
例外:
- 长的导入模块语句
- 注释里的URL
不要使用反斜杠来连接行
如:
s = 'hello ' \
'world'
Python会将圆括号,中括号和花括号中的行隐式连接,可以在表达式外增加一对额外的圆括号。
原:
x = 'This will build a very long long long long long string'
if width == 0 and height == 0 and color == 'red' and emphasis == 'strong':
print(x)
换行后:
x = ('This will build a very long '
'long long long long string')
if (width == 0 and height == 0 and
color == 'red' and emphasis == 'strong'):
print(x)
在注释里,如果有必要,将长的url放在一行上。
例如:
#HTML教程
#http://www.runoob.com/html/html-tutorial.html
括号
除非是用于实现行连接,否则不要在返回语句中或者条件语句中使用括号,不过在元组两边使用括号是可以的。
缩进
使用四个空格来缩进代码。不要使用tab或者tab和括号混用。
对于行连接的情况,要么垂直对齐行元素,或者使用4空格的悬挂式缩进。
空行
顶级定义之间空两行,比如函数或者类定义;类定义与第一个方法之间,都应该空一行。方法之间空一行。
空格
括号内不要有空格。
不要在逗号,分号,冒号前面使用空格,但应该在它们后面加空格(除了在行尾)。
参数列表、索引或切片的左括号前不应该加空格。
在二元操作符两边都加上一个空格,比如赋值(=), 比较 (==, <, >, !=, <>, <=, >=, in, not in, is, is not)
布尔(and, or, not)。
当 '='用于指示关键字参数或者默认值参数时,不要在其两侧使用空格。
不要使用空格垂直对齐多行间的标记。
注释
确保对模块,函数,方法和行内注释使用正确的风格。
Python有一种独一无二的注释方式:使用文档字符串。文档字符串是包,模块,类或函数里第一个语句。这些字符串可以通过对象的__doc__成员被自动提取,并且被pydoc所用。
文档字符串的惯例是使用三种双引号“”“,一个文档字符串应该这样组织:
1.首先是一行以句号,问号或者惊叹号结尾的概述(或者该文档字符串单纯只有一行)
2.接着是一个空行
3.接着是文档字符串的剩下的部分,它应该与文档字符串的第一行的第一个引号对齐。
模块 每个文件都应该是一个许可样板。使用项目使用的许可,选择合适的样板。
函数和方法 下文所指的函数,包括函数、方法以及生成器。一个函数必须要有文档字符串,除非它满足以下的条件:
1.外部不可见 2.非常短小 3.简单明了
文档字符串应该包含函数做什么,以及输入和输出的详细描述。通常,不应该描述”怎么做“,除非是一些复杂的算法。
文档字符串应该提供足够的信息,当别人编写代码调用该函数时,不需要看一行代码,只要看文档字符串就行了。对于复杂的代码,在代码旁边加上注释会比使用文档字符串更有意义。
关于函数的几个方面应该在特定的小节中进行描述:每节应该以一个标题行开始,标题以冒号结尾,除标题行外,节的其它内容应被缩进两个空格。
Args:列出每个参数的名字,并在名字后使用一个冒号和空格,分割对该参数的描述。如果描述太长超过了单行80字符,使用能够2或者4个空格的悬挂缩进(与文件其它部分保持一致)。描述应该包括所需的类型和定义。如果一个函数接受*foo(可变长度参列表)或者**bar(任意关键字参数),应该详细列出*foo和**bar。
Returns:(或者Yields:用于生成器)描述返回值的类型和语义, 如果函数返回None,这一部分可以省略。
Raises:列出与借口相关的所有异常。
类 类应该在其定义下有一个用于描述该类的文档字符串,如果类有公共属性(Attributes),那么文档中应该有一个属性(Attributes)段。并且应该遵守和函数参数相同的格式。
块注释和行注释
最需要写注释的是代码中那些技巧性的部分。如果你在下次代码审查的时候必须解释以下,那么你应该现在就给它写注释。对于复杂的操作,应该在其操作开始前写上若干行注释。对于不是一目了然的代码,应该在其行尾添加注释。
为了提高可读性,注释应该至少离开代码两个空格。另一方面,绝不要描述代码,假设阅读代码的人比你更懂Python,他只是不知道你的代码要做什么。
类:
如果一个类不继承其它类,就显式的从object继承,嵌套类也是一样。
继承object是为了使属性(properties)正常工作,并且这样可以保护你写的代码,使其不受PEP-3000的一个特殊的潜在不兼容的影响。这样做也定义了一些特殊方法,这些方法实现了对象的默认语意,包括
__new__,__init__,__delattr__,__getattr__,__setattr__,__hash__,__repr__,__str__
字符串
即使参数都是字符串,使用%s操作符或者格式化方法格式化字符串。在+和%之间做好判断。
x = a + b
x = '%s, %s' % (imperative, expletive)
x = '{}.{}!'.format(imperative, expletive)
x = 'name: %s; score: %d' % (name, n)
x = 'name: {}; score:{}'.format(name, n)
避免在循环中用+和+=操作符来累加字符串,由于字符串是不可变的,这样做会创建不必要的临时对象,并且导致二次方而不是线性的运行时间。作为代替方案,可以将每个字符串都加入列表,然后在循环结束后用.join连接列表。
在同一个文件中,保持使用字符串引号的一致性。使用单引号或者双引号之一用以引用字符串,并且在同一个文件中沿用。在字符串内可以使用另一种引号,以避免在字符串中使用。
为多行字符串使用三种双引号”“”而非三重单引号‘’‘,并且仅当项目中使用单引号’来引用字符串时,才可能会使用三重‘’‘为文档字符串的多行字符串来标识引用,文档字符串必须使用三种双引号"""。不过要注意,通常隐式行连接更清晰,因为多行字符串与程序其它部分的缩进方式不一致。
文件和sockets
在文档和sockets结束时,显式的关闭它。
除文件外,sockets或其它类似文件的对象在没有必要的时候打开会有许多副作用,例如:
1.它们可能会消耗有限的系统资源,如文件描述符。如果这些资源在使用后没有及时归还系统,那么用于处理这些对象的代码会将资源消耗殆尽。
2.持有文件将会组织对于文件的其它操作,诸如移动、删除之类的操作。
3.仅仅从逻辑上关闭文件和sockets,那么它们仍然可能会被其共享的程序在无意中进行读或者写操作。只有当它们真正被关闭后,对于它们尝试进行读或者写操作将会被抛出异常,并使得问题快速
显现出来。
而且,幻想当文件析构时,文件和sockets会自动关闭,试图将文件对象的生命周期和文件的状态绑定在一起的想法,都是不现实的,因为有如下几个原因:
1.没有任何方法可以确保运行环境会执行文件的析构。不同Python实现采用不同的内存管理技术,比如延时垃圾处理机制,演示垃圾处理机制可能会导致对象生命周期被任意无限延长。
2.对于文件的意外引用,会导致对于文件的持有时间超出预期(比如对于异常的跟踪,包含有全局变量等)
推荐使用"with"语句来管理文件。
对于不支持使用“with”语句的类似文件的对象,使用contextlib.closing()。
import contextlib
with context.closing(urlli.urlopen('http://www.baidu.com')) as front_age:
for line in front_page:
print line
为临时代码使用TODO注释,它是一种短期解决方案。
TODO注释应该在所有开头包含“TODO”字符串,紧跟着使用括号括起来你的名字,email地址或其它标识符,然后是一个可选的冒号,接着必须有一行注释,解释要做什么,主要目的是为了有一个
统一的TODO格式,这样添加注释的人就可以搜索到。写TODO注释并不保证写的人会亲自解决问题。当你写了一个TODO,请注明你的名字。
导入格式
import os
import sys
导入总应该放在文件顶部,位于模块注释和文档字符串之后,模块全局变量和常量之前,导入应该按照从最通用到最不通用的顺序分组。
每组分组中,应该可以根据每个模块的完整包路径按字典顺序,忽略大小写。
语句
通常每个语句应该独占一行。
如果测试结果与测试语句在一行放得下,你也可以将它们放在同一行中。如果是if语句,只有在没有else时才能这样做,特比的,绝对不要对try/except这样做,因为try和except不能放在同一行。
访问控制
在Python中,对于琐碎又不太重要的访问函数,你应该直接使用共有变量来去取代它们,这样可以避免额外的函数调用的开销,当添加更多功能时,你可以使用(property)来保持语法的一致性。
命名
应该避免的名称:
1.单字符的名称,除了计数器和迭代器。
2.包、模块名中的连接字符串(-)。
3。双下划线开头并结尾的名称。
命名约定
1.所谓“内部(Internal)”表示仅模块内可用,或者,在类内是保护或私有的。
2.用单下划线(_)开头表示模块变量或者函数是protected的(使用import * from)时不包含。
3.用双下划线(__)开头的实例变量或者方法表示类内私有。
4.将相关的类和顶级域名放在同一个模块里。
5.对类名使用大写字母开头的单词,但是模块名应该使用小写加下划线的方式。
Main
主功能应该放在一个main()函数中。
在Python中,pydoc以及测试单元要求模块必须是可导入的。代码应该在执行主程序前总是检查if __name__ == '__main__',这样当模块被导入时主程序就不会被执行。
def main():
pass
if __name__ == '__main__':
main()
所有的顶级代码在模块导入时都会被执行,不要去调用函数,创建对象,或者执行那些不应该在pydoc时执行的操作。