1、1.代码布局设计1.1 缩进A、 使用四个空格来进行缩进B、 换行的时候可以使用反斜杠,最好的方法是使用 圆括号,在使用反斜杠的时候,在反斜杠的后直接回车,不能有任何空格存在。比较好的做法如下:# Aligned with opening delimiter.foo = long_function_name(var_one, var_two,var_three, var_four)包含更多的缩进表示是剩余部分:# More indentation included to distinguish this from the rest.def long_function_name(var_one,
2、 var_two, var_three,var_four):print(var_one)悬挂缩进应该添加一个级别:# Hanging indents should add a level.foo = long_function_name(var_one, var_two,var_three, var_four)比较差的做法如下:(代码同样是可以运行的)# Arguments on first line forbidden when not using vertical alignment.未使用垂直对齐foo = long_function_name(var_one, var_two,var_
3、three, var_four)# Further indentation required as indentation is not distinguishable.(未使用缩进来表示每一层级)def long_function_name(var_one, var_two, var_three,var_four):print(var_one)对于续行来说,四个空格的缩进是可选的。可选的如下:# Hanging indents *may* be indented to other than 4 spaces.悬挂缩进的时候可以不是四个空格foo = long_function_name(va
4、r_one, var_two,var_three, var_four)当使用 if 语句的时候,如果条件恰好的缩进为四个空格空格,那么导致后面的语句的缩进也是四个空格,那么这种情况下是可以接受的,如下所示:没有额外的缩进:# No extra indentation.if (this_is_one_thing andthat_is_another_thing):do_something()添加一个注释来进行分割缩进,做到语法高亮显示:# Add a comment, which will provide some distinction in editors# supporting synta
5、x highlighting.if (this_is_one_thing andthat_is_another_thing):# Since both conditions are true, we can frobnicate.do_something()在续行中添加额外的缩进:# Add some extra indentation on the conditional continuation line.if (this_is_one_thingand that_is_another_thing):do_something()成对的小括号,中括号在多行的结构中可以写成多行,然后括号在第一
6、个不为空白的位置结束。如下:my_list = 1, 2, 3,4, 5, 6,result = some_function_that_takes_arguments(a, b, c,d, e, f,)或者对齐第一个字符的位置结束,如下:my_list = 1, 2, 3,4, 5, 6,result = some_function_that_takes_arguments(a, b, c,d, e, f,)1.2 tab 和空格的选择关于 tab 的空格的选择,在 python2 中是可以混用的,但是在 python3 中,只能用一种风格。1.3 最大行长度行的最大长度为 79 个字符在书写
7、文档或者是注释的时候,行长度应该控制在 72 个字符 。反斜杠在有的时候是适用的,例如在参数很长,但是不能隐式的使用多行的时候,如下反斜杠的使用:with open(/path/to/some/file/you/want/to/read) as file_1, open(/path/to/some/file/being/written, w) as file_2:file_2.write(file_1.read()确保在合适的时候将连续的行进行分开,最好的位置是操作符之后,而不是在操作符之前,如下:class Rectangle(Blob):def _init_(self, width, he
8、ight,color=black, emphasis=None, highlight=0):if (width = 0 and height = 0 andcolor = red and emphasis = strong orhighlight 100):raise ValueError(“sorry, you lose“)if width = 0 and height = 0 and (color = red oremphasis is None):raise ValueError(“values are %s, %s“ %(width, height)Blob._init_(self,
9、width, height,color, emphasis, highlight)1.4 空行 Top level 函数和类的定义的时候,空两行。 类中方法的定义空一行。 在函数中谨慎使用空行来表示相关的逻辑段。 无关的函数之间用一个空行进行分割。1.5 源文件编码在源文件中一直使用 utf-8 编码,在 python2 中使用 ascll 编码(存疑?)。文件,在 python2 中使用 ascll 编码,在 python3 中使用 utf-8 编码1.6 导入Import 经常使用单独的行,如下:import osimport sys或者使用如下的方式: from subprocess i
10、mport Popen, PIPE模块内容顺序:模块说明和 docstringimportglobals x, y = y, xNo: if x = 4 : print x , y ; x , y = y , xC 在切片的时候,避免使用空格,在扩展的切片中,必须使用相同的空格个数,如下所示:Yes:ham1:9, ham1:9:3, ham:9:3, ham1:3, ham1:9:hamlower:upper, hamlower:upper:, hamlower:stephamlower+offset : upper+offsetham: upper_fn(x) : step_fn(x),
11、ham: step_fn(x)hamlower + offset : upper + offsetNo:hamlower + offset:upper + offsetham1: 9, ham1 :9, ham1:9 :3hamlower : : upperham : upperD函数的左括号前不要添加空格:Yes: spam(1)No: spam (1)E 中括号前不要添加空格Yes: dctkey = lstindexNo: dct key = lst indexF 操作符左右各一个空格,不要为了追求一致从而添加空格个数Yes:x = 1y = 2long_variable = 3No:x
12、 = 1y = 2long_variable = 33.2 其他建议A 避免在任何结尾添加空白。B 在下列操作符中左右各留空白assignment ( = ), augmented assignment ( += , -= etc.), comparisons ( = , , != , , = , in , not in , is , is not ), Booleans ( and , or , not )C 如果操作符优先级不同,注意在操作符左右留空白,特别是高优先级和低优先级的Yes:i = i + 1submitted += 1x = x*2 - 1hypot2 = x*x + y*y
13、c = (a+b) * (a-b)No:i=i+1submitted +=1x = x * 2 - 1hypot2 = x * x + y * yc = (a + b) * (a - b)D 在使用函数的时候,赋值和默认值之间不需要空格Yes:def complex(real, imag=0.0):return magic(r=real, i=imag)No:def complex(real, imag = 0.0):return magic(r = real, i = imag)E 不要将多语句写在同一行Rather not:if foo = blah: do_blah_thing()for
14、 x in lst: total += xwhile t 10: t = delay()Definitely not:if foo = blah: do_blah_thing()else: do_non_blah_thing()try: something()finally: cleanup()do_one(); do_two(); do_three(long, argument,list, like, this)if foo = blah: one(); two(); three()4.注释在修改的代码的时候,务必修改注释。注释必须是英文,最好是完整的句子,首字母大写4.1 块注释在一段代码
15、前增加注释,在#后添加一个空格,段落之间只有一个#作为行间隔# Description : Module config.# Input : None# Output : None4.2 行注释在使用行注释的时候,在代码句子结束之后至少两个空格,然后用#开头后跟一个空格x = x + 1 # Increment xBut sometimes, this is useful:x = x + 1 # Compensate for border4.3 文档注释在所有的公共模块,函数,类,方法中加入文档注释,这些注释写在 def 之后。在进行多行注释的时候,注意“”“结束的时候,必须独占一行 ,如下:“
16、Return a foobangOptional plotz says to frobnicate the bizbaz first.“当文档注释是一行的时候,确保开始的“”和“”“ 在同一行中。5.命名规范使用单独的小写字母(b)使用单独的大写字母(B)使用小写字母(lowercase)使用小写字母和下划线(lower_case_with_underscores)使用大写字母(UPPERCASE)使用大写字母和下划线(UPPER_CASE_WITH_UPPERCASE)驼峰式写法(CamelCase): 在使用缩写的时候,大写优于小写例如 HTTPServer 优于HttpServer首字母
17、大写,然后使用下划线是一种丑陋的写法5.1 避免使用的名称在写变量的时候,尽量避免小写的 l 和大写字母 O 和大写字母 I,主要原因是容易和数字中1,0 相混淆。5.2 包和模块的名称模块尽量使用简短的全部小写的名称,如果可以增加可读性那么可以使用下划线,Python的包不推荐使用下划线,但是在引用其他语言写的扩展包中可以使用下划线来表示区分。5.3 类名称类名称主要遵循为 CapWords 约定,表示为首字母大写。模块内部使用的类采用_CapWords的方式。5.4 异常名称异常归于类,从而也要遵循类名的规范,主要是在后缀上必须添加“Error“5.5 全局变量名全局变量只在模块类有效,和
18、 function 命名相同。全局变量尽量只在模块内有效,类似 C语言中的 static。实现方法有两种,一是 _all_机制;二是前缀一个下划线。5.6 方法名称方法名称全部为小写,下划线是可选的(在增加可读性的基础上使用)。5.7 方法变量类的方法第一个参数总是 self类方法的静态变量总是为 crs如果一个方法的参数和保留字相冲突,那么在后面添加下划线进行区分5.8 常量常量命名全部使用大写,可以使用下划线进行分割。5.9 类的属性方法命名 类的属性(方法和变量)命名使用全部小写的方式,可以使用下划线。 类的属性有 3 种作用域 public、non-public 和 subclass
19、API,可以理解成 C+中的public、private、protected ,non-public 属性前,前缀一条下划线。 类的属性若与关键字名字冲突,后缀一下划线,尽量不要使用缩略等其他方式。 为避免与子类属性命名冲突,在类的一些属性前,前缀两条下划线。比如:类 Foo 中声明_a,访问时,只能通过 Foo._Foo_a,避免歧义。如果子类也叫 Foo,那就无能为力了。 数据值应该使用名词作为名字,方法使用谓词(动词加对象)6.编码建议6.1 单独比较的时候使用 is 或者 is not,不要使用=进行比较。6.2 当实现比较的方法的时候,最好全部实现_eq_ , _ne_ ,_lt_
20、, _le_ , _gt_ , _ge_ ),而不要单独实现一个。6.3 使用 startswith() and endswith()代替切片进行序列前缀或后缀的检查。比如Yes: if foo.startswith(bar):优于No: if foo:3 = bar:6.4 编码中考虑到其他 python 实现的效率等问题比如运算符+ 在 CPython( Python)中效率很高,都是 Jython 中却非常低,所以应该采用.join()的方式。6.5 使用 isinstance()比较对象的类型。比如Yes: if isinstance(obj, int): 优于No: if type(
21、obj) is type(1):6.6 异常编写 使用基于类的异常,每个模块或包都有自己的异常类,此异常继承自 Exception。 异常中不要使用裸露的 except,except 后跟具体的 exceptions。 异常中 try 的代码尽量少。try:value = collectionkeyexcept KeyError:return key_not_found(key)else:return handle_value(value)要优于try:# Too broad!return handle_value(collectionkey)except KeyError:# Will al
22、so catch KeyError raised by handle_value()return key_not_found(key)6.7 判断序列空或不空有如下规则Yes: if not seq:if seq:优于No: if len(seq)if not len(seq)6.8 字符串不要以空格收尾。6.9 二进制数据判断使用 if boolvalue 的方式。7.编码示例7.1 变量常量:大写加下划线USER_CONSTANT对于不会发生改变的全局变量,使用大写加下划线。私有变量 : 小写和一个前导下划线_private_valuePython 中不存在私有变量一说,若是遇到需要保护的
23、变量,使用小写和一个前导下划线。但这只是程序员之间的一个约定,用于警告说明这是一个私有变量,外部类不要去访问它。但实际上,外部类还是可以访问到这个变量。内置变量 : 小写,两个前导下划线和两个后置下划线_class_两个前导下划线会导致变量在解释期间被更名。这是为了避免内置变量和其他变量产生冲突。用户定义的变量要严格避免这种风格。以免导致混乱。7.2 函数和方法总体而言应该使用,小写和下划线。但有些比较老的库使用的是混合大小写,即首单词小写,之后每个单词第一个字母大写,其余小写。但现在,小写和下划线已成为规范。私有方法 : 小写和一个前导下划线def _secrete(self):print “dont test me.“这里和私有变量一样,并不是真正的私有访问权限。同时也应该注意一般函数不要使用两个前导下划线(当遇到两个前导下划线时, Python 的名称改编特性将发挥作用)。特殊函数后面会提及。特殊方法 : 小写和两个前导下划线,两个后置下划线def _add_(self, other):return int._add_(other)这种风格只应用于特殊函数,比如操作符重载等。函数参数 : 小写和下划线,缺省值等号两边无空格def connect(self, user=None):self._user = user