1.代码布局设计1.1缩进A、使用四个空格来进行缩进B、换行的时候可以使用反斜杠,最好的方法是使用圆括号,在使用反斜杠的时候,在反斜杠的后直接回车,不能有任何空格存在。比较好的做法如下:#Alignedwithopeningdelimiter.foo=long_function_name(var_one,var_two,var_three,var_four)包含更多的缩进表示是剩余部分:#Moreindentationincludedtodistinguishthisfromtherest.deflong_function_name(var_one,var_two,var_three,var_four):print(var_one)悬挂缩进应该添加一个级别:#Hangingindentsshouldaddalevel.foo=long_function_name(var_one,var_two,var_three,var_four)比较差的做法如下:(代码同样是可以运行的)#Argumentsonfirstlineforbiddenwhennotusingverticalalignment.—未使用垂直对齐foo=long_function_name(var_one,var_two,var_three,var_four)#Furtherindentationrequiredasindentationisnotdistinguishable.(未使用缩进来表示每一层级)deflong_function_name(var_one,var_two,var_three,var_four):print(var_one)对于续行来说,四个空格的缩进是可选的。可选的如下:#Hangingindents*may*beindentedtootherthan4spaces.悬挂缩进的时候可以不是四个空格foo=long_function_name(var_one,var_two,var_three,var_four)当使用if语句的时候,如果条件恰好的缩进为四个空格空格,那么导致后面的语句的缩进也是四个空格,那么这种情况下是可以接受的,如下所示:没有额外的缩进:#Noextraindentation.if(this_is_one_thingandthat_is_another_thing):do_something()添加一个注释来进行分割缩进,做到语法高亮显示:#Addacomment,whichwillprovidesomedistinctionineditors#supportingsyntaxhighlighting.if(this_is_one_thingandthat_is_another_thing):#Sincebothconditionsaretrue,wecanfrobnicate.do_something()在续行中添加额外的缩进:#Addsomeextraindentationontheconditionalcontinuationline.if(this_is_one_thingandthat_is_another_thing):do_something()成对的小括号,中括号在多行的结构中可以写成多行,然后括号在第一个不为空白的位置结束。如下: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.2tab和空格的选择关于tab的空格的选择,在python2中是可以混用的,但是在python3中,只能用一种风格。1.3最大行长度行的最大长度为79个字符在书写文档或者是注释的时候,行长度应该控制在72个字符。反斜杠在有的时候是适用的,例如在参数很长,但是不能隐式的使用多行的时候,如下反斜杠的使用:withopen('/path/to/some/file/you/want/to/read')asfile_1,\open('/path/to/some/file/being/written','w')asfile_2:file_2.write(file_1.read())确保在合适的时候将连续的行进行分开,最好的位置是操作符之后,而不是在操作符之前,如下:classRectangle(Blob):def__init__(self,width,height,color='black',emphasis=None,highlight=0):if(width==0andheight==0andcolor=='red'andemphasis=='strong'orhighlight100):raiseValueError(sorry,youlose)ifwidth==0andheight==0and(color=='red'oremphasisisNone):raiseValueError(valuesare%s,%s%(width,height))Blob.__init__(self,width,height,color,emphasis,highlight)1.4空行Toplevel函数和类的定义的时候,空两行。类中方法的定义空一行。在函数中谨慎使用空行来表示相关的逻辑段。无关的函数之间用一个空行进行分割。1.5源文件编码在源文件中一直使用utf-8编码,在python2中使用ascll编码(存疑?)。文件,在python2中使用ascll编码,在python3中使用utf-8编码1.6导入Import经常使用单独的行,如下:importosimportsys或者使用如下的方式:§fromsubprocessimportPopen,PIPE模块内容顺序:模块说明和docstring—import—globals&constants—其他定义import总是在文件的最上行,在模块的注释和docstring之后,在模块的全局变量之前。import可以按照以下顺序进行组织:A标准类库importB第三方importC本地类库import在每个组导入之后,可以用空行进行分割把所有__all__相关类型的声明放在import之后推荐使用绝对导入,可读性强,如下:importmypkg.siblingfrommypkgimportsiblingfrommypkg.siblingimportexample对于复杂的封装布局来说,相对导入也是可以接受的,主要是使用绝对导入的时候路径太长,如下:from.importsiblingfrom.siblingimportexample当导入一个类的时候,可以使用如下的方式:frommyclassimportMyClassfromfoo.bar.yourclassimportYourClass当以上的写法导致本地名称冲突,可以写成如下:importmyclassimportfoo.bar.yourclass并且使用myclass.MyClassandfoo.bar.yourclass.YourClass。在导入模块的时候,应该避免通配符的存在,如下:frommoduleimport*2.字符串引号在对于字符串的标示中,使用双引号还是单引号是没有区别的,主要就是两者混合使用从而避免反斜杠的出现。3.在表达式和语句中使用空格3.1避免使用空格情况A.在小括号,中括号,大括号中避免使用空格Yes:spam(ham[1],{eggs:2})No:spam(ham[1],{eggs:2})B.在逗号,分号,冒号之前不需要空格Yes:ifx==4:printx,y;x,y=y,xNo:ifx==4:printx,y;x,y=y,xC.在切片的时候,避免使用空格,在扩展的切片中,必须使用相同的空格个数,如下所示:Yes:ham[1:9],ham[1:9:3],ham[:9:3],ham[1::3],ham[1:9:]ham[lower:upper],ham[lower:upper:],ham[lower::step]ham[lower+offset:upper+offset]ham[:upper_fn(x):step_fn(x)],ham[::step_fn(x)]ham[lower+offset:upper+offset]No:ham[lower+offset:upper+offset]ham[1:9],ham[1:9],ham[1:9:3]ham[lower::upper]ham[:upper]D.函数的左括号前不要添加空格:Yes:spam(1)No:spam(1)E.中括号前不要添加空格Yes:dct['key']=lst[index]No:dct['key']=lst[index]F.操作符左右各一个空格,不要为了追求一致从而添加空格个数Yes:x=1y=2long_variable=3No:x=1y=2long_variable=33.2其他建议A.避免在任何结尾添加空白。B.在下列操作符中左右各留空白assignment(=),augmentedassignment(+=,-=etc.),comparisons(==,,,!=,,=,=,in,notin,is,isnot),Booleans(and,or,not)C.如果操作符优先级不同,注意在操作符左右留空白,特别是高优先级和低优先级的Yes:i=i+1submitted+=1x=x*2-1hypot2=x*x+y*yc=(a+b)*(a-b)No:i=i+1submitted+=1x=x*2-1hypot2=x*x+y*yc=(a+b)*(a-b)D.在使用函数的时候,赋值和默认值之间不需要空格Yes:defcomplex(real,imag=0.0):returnmagic(r=real,i=imag)No:defcomplex(real,imag=0.0):returnmagic(r=real,i=imag)E.不要将多语句写在同一行Rathernot:iffoo=='blah':do_blah_thing()forxinlst:total+=xwhilet10:t=delay()Definitelynot:iffoo=='blah':do_blah_thing()else:do_non_blah_thing()try:something()finally:cleanup()do_one();do_two();do_three(long,argument,list,like,this)iffoo=='blah':one();two();three()4.注释在修改的代码的时候,务必修改注释。注释必须是英文,最好是完整的句子,首字母大写4.1块注释在一段代码前增加注释,在#后添加一个空格,段落之间只有一个#作为行间隔#Description:Moduleconfig.##Input:None##Output:None4.2行注释在使用行注释的时候,在代码句子结束之后至少两个空格,然后用#开头后跟一个空格x=x+1#IncrementxButsometimes,thisisuseful:x=x+1#Compensateforborder4.3文档注释在所有的公共模块,函数,类,方法中加入文档注释,这些注释写在def之后。在进行多行注释的时候,注意“”“结束的时候,必须独占一行,如下:ReturnafoobangOptionalplotzsaystofrobnicatethebizbazfirst.当文档注释是一行的时候,确保开始的““”和“”“在同一行中。5.命名规范使用