Python代码风格指南_第1页
Python代码风格指南_第2页
Python代码风格指南_第3页
Python代码风格指南_第4页
Python代码风格指南_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Python代码风格指南介绍Python发行版中组成标准库的PythonPEP关于Python的C实现的C编码风格指南的描述。本文档和PEP257〔文档字符串标准〕改编自Guido的《Python容作为补充。这篇风格指南随着时间的推移而渐渐演化,随着语言本身的变化,一些过去的商定已经过时,并确定了更多的商定。很多工程都有自己的编码风格指南。假设有任何冲突,优先使用该工程特定的指南。愚蠢地坚持全都性是无知的妖怪Guido这里供给的指南旨在提高代码的可读性,并使各种不同的Python代码全都。如PEP20所说,“易读性格外重要”。风格指南是关于全都性的。与本风格指南全都很重要。工程中的全都性更重要。一个模块或功能中的全都性最重要。最重要的是:知道何时会不全都——有时风格指南就不适用了。疑心时,作出你最正确的推断。看看其他的例子,并打算什么是最好的。不要迟疑,尽管发问!特别地:不要只为遵从这个PEP而打破向后兼容性!可以无视局部风格指南的好理由,不要只为遵从这个PEP而打破向后兼容性!无视既定指南的一些其他的好理由:当应用指南会降低代码的可读性,即使对于那些习惯遵照这个PEP来阅读代码的人来说。与四周的代码保持全都也会破坏它〔可能是历史缘由〕——虽然这也是整理别人烂摊子的好时机〔在真正的XP风格中〕。由于问题代码先于指南,又没有其它的修改理由。Python特性。代码布局缩进每级缩进用4个空格连续行的折叠元素应当对齐#与起始定界符对齐:foo=long_function_name(var_one,var_two,var_three,var_four)#使用更多的缩进,以区分于其他代码deflong_function_name(var_one,var_two,var_three,var_four):print(var_one)#悬挂时,应当增加一级缩进foo=long_function_name(var_one,var_two,var_three,var_four)#悬挂不愿定要4个空格foo=long_function_name(var_one,var_two,var_three,var_four)if语句条件块太长需要写成多行.值得留意的是两个字符组成的关键字〔例如if〕,加上一个空格,加上开括号,为后面的多行条件创立了一个4个空格的缩进。这会给嵌入if内的缩进语句产生视觉冲突,由于它们也被缩进4个空格。这个PEP没有明确如何〔是否〕if语句内的行。这种状况下,可以承受的选项包括,但不仅限于:#不增加额外的缩进if(this_is_one_thingandthat_is_another_thing):do_something#添加一行注释,这将为支持语法高亮的编辑器供给一些区分if(this_is_one_thingandthat_is_another_thing):#当两个条件都是真,我们将要执行do_something#在换行的条件语句前,增加额外的缩进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”,)制表符还是空格空格是最优先的缩进方式当已经使用制表符是,应当保持全都性,连续使用制表符Python3不允许混合使用制表符和空格来缩进。Python2的代码中混合使用制表符和空格的缩进,应当转化为完全使用空格。调用python命令行解释器时使用-t选项,可对代码中不合法得混合制表符和空格发出警告(warnings)。使用-tt时警告(warnings)将变成错误(errors).这些选项是被高度推举的.最大行长度限制全部行最多79个字符。下垂的长块构造限制为更少的文本〔文档字符串或注释〕,行的长度应当限制在72个字符。限制编辑器窗口宽度使得并排翻开多个文件成为可能,并且使用代码审查工具显示相邻列的两个版本工作正常。绝大多数工具的默认折叠会破坏代码的可视化构造,使其更难以理解。编辑器中的窗口宽度设置为80个字符。即使该工具将在最终一列中标记字形。一些基于网络的工具可能不会供给动态的自动换行。有些团队猛烈宠爱较长的行长度。对于代码维护完全或主要由一个团队的,可以在这个问题上达成协议,象征性的将行长度从80个字符增加到100个字符〔有效地增加最大长度到99个字符〕也是可以的,供给注释和文档字符串仍是72个字符。Python79〔文档字符串/注释到72个字符〕。折叠长行的首选方法是使用Pyhon支持的圆括号,方括号(brackets)和花括号(braces)内的行连续。长行可以在表达式外面使用小括号来变成多行。连续行使用反斜杠更好。反斜杠有时可能照旧是适宜的。例如,长的多行的with语句不能用隐式续行,可以用反斜杠:#反斜杠有时可能照旧是适宜的。例如,长的多行的with语句不能用隐式续行,可以用反斜杠: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)另一种类似的状况是在assert语句中确认恰当地缩进了连续的行换行应当在二元操作符前面还是后面几十年来推举的风格是在二元操作符后换行。但这会通过两种方式影响可读性:操作符往往分散在屏幕的不同的列上,并且每,眼睛要做额外的工作看清哪些数是添加或减去:#坏的:操作符远离它们的操作数income=(gross_wages+taxable_interest+(dividends-qualified_dividends)-ira_deduction-student_loan_interest)为了解决这个可读性问题,数学家和出版商遵循相反的商定。DonaldKnuth:“尽管后一段总是打破内公式二进制操作和关系,显示公式总是在二进制操作前换行”。以下的数学运算传统通常可以使得结果更加具有可读性#好的:易于匹配操作数和操作符income=(gross_wages+taxable_interest+(dividends-qualified_dividends)ira_deductionstudent_loan_interest)#二元运算符首选的换行位置在操作符后面classRectangle(Blob):def init (self,width,height,color=”black”,emphasis=None,highlight=0):ifwidth==0andheight==0and\color==”red”andemphasis==”strong”or\highlight>100):raiseValueError(“sorry,youlose“)ifwidth==0andheight==0and(color==”red”oremphasisisNone):raiseValueError(“Idon”tthinkso--valuesare%s,%s“%(width,height))Blob. init (self,width,height,color,emphasis,highlight)在Python代码中,允许打破之前或之后一个二元运算符的规章,只要与当前惯例是全都的。为代码Knuth的风格。空行用两行空行分割顶层函数和类的定义.类内方法的定义用单个空行分割.额外的空行可被用于(保守的(sparingly))分割一组相关函数(groupsofrelatedfunctions).在一组相关的单句中间可以省略空行.(例如.一组哑元(asetofdummyimplementations)).在函数中使用空行时,请慎重的用于表示一个规律段落(indicatelogicalsections).Python承受contol-L(即^L)换页符作为空格;Emacs(和一些打印工具)视这个字符为页面分割符,因此在你的文件中,可以用他们来为相关片段(sections)分页。留意,一些编辑器和基于Web的代码查看器可能不能识别control-L的字形。源文件编码Python核心公布中的代码应当始终使用UTF-8〔或Python2中用ASCII〕。文件使用ASCII〔Python2中〕或UTF-8〔Python3中〕不应有编码声明。在标准库中,非默认编码仅用于测试目的或注释或文档字符串需要提及包含非ASCII\x,\u,\U,或\N是字符串中包含非ASCII数据的首先方式。Python3.0及以上版本,为标准库〔参见PEP3131〕规定以下策略:Python标准库中的全部标识符必需使用ASCII标识符,在可行的地方使用英文单词〔在很多例子中,使用非英文的缩写和专业术语〕。另外,字符串和注释必需用ASCII。仅有的例外是〔a〕测试非ASCII的特点,〔b〕测试作者名。不是基于拉丁字母表的作者名必需供给一个他们名字的拉丁字母表的音译。开源工程面对全球,鼓舞承受统一策略。导入#通常应当在单独的行中导入(Imports)importosimportsys#这样也是可以的fromsubprocessimportPopen,PIPEImports通常被放置在文件的顶部,仅在模块注释和文档字符串之后,在模块的全局变量和常量之前.Imports应当有挨次地成组安放.标准库的导入(Imports相关的第三方导入(即,全部的email包在随后导入)特定的本地应用/库导入(imports)你应当在每组导入之间放置一个空行.把任何相关标准放在导入之后。推举确定导入,由于它们更易读,并且假设导入系统配置的不正确〔例如当包中的一个名目在sys.path的最终〕它们有更好的表现〔或者至少给出更好的错误信息〕:importmypkg.siblingfrommypkgimportsiblingfrommypkg.siblingimportexample明确的相对导入可以被承受用来替代确定导入,特别是处理复杂的包布局时,确定导入过于冗长。from.importsiblingfrom.siblingimportexample标准库代码应当避开简洁包布局并使用确定导入。隐式的相对导入应当永久不被使用,并且在Python3中已经移除。从一个包含类的模块中导入类时,下面这样通常是好的写法:frommyclassimportMyClassfromfoo.bar.yourclassimportYourClass#假设这种写法导致本地名字冲突,那么就这样写:importmyclassimportfoo.bar.yourclass#并使用“myclass.MyClass”和“foo.bar.yourclass.YourClass”来访问。避开使用通配符导入〔from模块名import*〕,由于这样就不清楚哪些名字消灭在命名空间,这会让读者和很多自动化工具困惑。通配符导入有一种合理的使用状况,重公布一个内部接口作为一个公共API的一局部〔例如,重写一个纯Python实现的接口,该接口定义从一个可选的模块并且哪些定义将被重写提前并不知道〕。用这种方式重命名,下面的有关公共和内部接口的指南仍适用。字符串引号Python中,单引号字符串和双引号字符串是一样的,本PEP不建议如此,建议选择一个并坚持下去。当一个字符串包含单引号字符或双引号字符时,使用另一种字符串引号来避开字符串中使用反斜杠。这可以提高可读性。三引号字符串,总是使用双引号字符,与PEP257文档字符串标准保持全都。表达式和语句中的空格Guido不宠爱在以下地方消灭空格以下状况避开使用多余的空格#紧挨着圆括号,方括号和花括号的spam(ham[1],{eggs:2})#紧贴在逗号,分号或冒号前的ifx==4:printx,y;x,y=y,x#在切片中冒号像一个二元操作符,冒号两侧应当有一样数量的空格〔把它看作最低优先级的操作符〕。#在一个扩展切片中,两个冒号必需有相等数量的空格。#例外:当一个切片参数被省略时,该空格也要被省略。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]#紧贴着函数调用的参数列表前开式括号(openparenthesis)的spam(1)#紧贴在索引或切片(slicing?下标?)开头的开式括号前的dct[”key”]=lst[index]#在赋值(或其它)运算符四周,不要为了与其他的赋值〔或其它〕操作符对齐,使用不止一个空格。x=1y=2long_variable=3其它建议避开跟随空格。由于它通常是无形的,它可能会让人很困惑:如一个反斜杠,后跟一个空格和一个换行符不算作一行连续标记。有些编辑器不保护它,并且很多工程(如CPython本身)导向钩子,拒绝它。始终在这些二元运算符两边放置一个空格:赋值(=),比较(==,<,>,!=,<>,<=,>=,in,notin,is,isnot)布尔运算(and,or,not).〔一个或多个。不要使用多于一个空格,二元运算符两侧空格数量相等。i=i+1submitted+=1x=x*2-1hypot2=x*x+y*yc=(a+b)*(a-b)#不要在用于指定关键字参数或默认参数值的”=”号四周使用空格,例如:defcomplex(real,imag=0.0):returnmagic(r=real,i=imag)#函数注释应当对冒号使用正常规章,并且,假设存在->,两边应当有空格defmunge(input:AnyStr):...defmunge->AnyStr:...#结合一个参数注释和默认值时,在=符号两边使用空格(仅仅当那些参数同时有注释和一个默认值时)。defmunge(sep:AnyStr=None):...defmunge(input:AnyStr,sep:AnyStr=None,limit=1000):...#不要将多条语句写在同一行上.iffoo==”blah”:do_blah_thingdo_onedo_twodo_three#尽管有时可以将if/for/while和一小段主体代码放在一行,但在一个有多条子句的语句中不要如此。避开折叠长行!#最好不要iffoo==”blah”:do_blah_thingforxinlst:total+=xwhilet<10:t=delay注释同代码不全都的注释比没注释更差.当代码修改时,始终优先更注释!注释应当是完整的句子.假设注释是一个短语或句子,首字母应当大写,除非他是一个以小写字母开头的标识符(永久不要修改标识符的大小写).假设注释很短,由完整句子构成的段落组成,每个句子都应当以句号结尾.你应当在句末的句号后使用两个空格,以便使Emacs的断行和(译按:应当说是使这两种功能正常工作给出了文档构造的提示).用英语书写时,断词和空格是可用的.非英语国家的Python程序员:请用英语书写你的注释,除非你120%确实信这些代码不会被不懂你的语言的人阅读.““““““我就是坚持全部使用中文来注释,真刚要公布脚本工具时,再想E文的;开发时每一瞬间都要用在思考中,坚决不用在E文语法,单词的回忆中!--ZoomQUiet商定使用统一的文档化注释格式有利于良好习惯和团队建议!文档化开发注释标准注释块注释块通常应用于跟随着一些(或者全部)代码并和这些代码有着一样的缩进层次.注释块中每行以”#”和一个空格开头(除非他是注释内的缩进文本).注释块内的段落以仅含单个”#”的行分割.行内注释行内注释应当慎重使用.一个行内注释是和语句在同一行的注释.行内注释应当至少用两个空格和语句分开.它们应当以”#”和单个空格开头.假设行内注释指出的是显而易见的,那么它就是不必要的。#不要这样做:x=x+1#x#但有时,这样是有用的:xx1#补偿border文档字符串应当始终遵守在PEP257中编写好的文档字符串(又名“docstrings“)的商定,““““““DocumentationStrings--;pydoc;epydoc,Doxygen等等文档化工具的使用,类似于MoinMoin语法,商定一些字符,以便自动提取转化为有意义的文档章节等等文章元素!--Zoomq“““为全部公共模块,函数,类和方法编写文档字符串.文档字符串对非公开的方法不是必要的,但你应当有一个描述这个方法做什么的注释.这个注释应当在“def“这行后.PEP257描述了好的文档字符串的商定.确定留意,多行文档字符串结尾的\“\“\“应当单独成行,例如:“““ReturnafoobangOptionalplotzsaystofrobnicatethebizbazfirst.“““对单行的文档字符串,请保持结尾的“““在同一行.版本注记假设你要将RCS或CVS的杂项(crud)包含在你的源文件中,按如下做. version =“$Revision$“#$Source:E:/cvsroot/python_doc/pep8.txt,v$这个行应当包含在模块的文档字符串之后,全部代码之前,上下用一个空行分割.对于CVS的效劳器工作标记更应当在代码段中明确出它的使用如:在文档的最开头的版权声明后应参与如下版本标记:#文件:$id$#$Revision$这样的标记在提交给配置治理效劳器后,会自动适配成为相应的字符串,如:#文件:$Idussp.py,v1.222023/07/2104:47:41hdExp$#$Revision1.4$----HD命名商定Python库的命名商定有点混乱,所以我们将永久不能使之变得完全全都---不过还是有公认的命名标准的.的模块和包(包括第三方的框架)必需符合这些标准,但对已有的库存在不同风格的,保持内部的全都性是首选的.根本原则用户可见的API的公开局部的名称,应当表达用法而不是实现。描述:命名风格有很多不同的命名风格.以下的有助于识别正在使用的命名风格,独立于它们的作用.以下的命名风格是众所周知的:b单个小写字母)B单个大写字母)小写串如:getname带下划的小写串如:_getname,lower_case_with_underscores大写串如:GETNAME带下划的大写串如:_GETNAME,UPPER_CASE_WITH_UNDERSCORESCapitalizedWords(首字母大写单词串CapWords,CamelCase/--这样命名是由于它的字母错落有致的样子而来的.这有时也被当作StudlyCaps.如:GetNameCapWords因此ServerError优于ServerError。mixedCase(混合大小写串)(与首字母大写串不同之处在于第一个字符是小写如:getName)Capitalized_Words_With_Underscores(带下划线的首字母大写串丑陋!)还有一种使用特别前缀的风格,用于将相关的名字分成组。Python中很少这样用,但是出于完整性要提一下.例如,os.stat函数返回一个元祖,它的元素名字通常类似st_mode,st_size,st_mtime等等这样。〔这样做是为了强调与POSIX系统调用构造体全都,这有助于程序员生疏这些。〕X11库的全部的公开函数以XPython为是不必要的,由于属性名和函数名以对象名作前缀,而函数名以模块名作前缀。另外,以下用下划线作前导或结尾的特别形式是被公认的(一般可以与任何商定相结合):_single_leading_underscore(以一个下划线作前导):弱的“内部使用(internaluse)“标志.(例如,“fromMimport*“不会导入以下划线开头的对象).single_trailing_underscore_(以一个下划线结尾):用于避开与Python关键词的冲突,例如.“Tkinter.Toplevel(master,class_=”ClassName”)“. double_leading_underscore(双下划线):从Python1.4起为类私知名.调用时名称转变〔类FooBar中, boo变成_FooBar boo;见下文〕。 double_leading_and_trailing_underscore :特别的(magic)对象或属性,存在于用户把握的(user-controlled)名字空间.例如: init , import 或 file .有时它们被用户定义,用于触发某个特别行为(magicbehavior)(例如:运算符重载);有时被构造器(infrastructure)插入,以便自己使用或为了调试.因此,在将来的版本中,构造器(松散得定义为Python解释器和标准库)可能打算建立自己的魔法属性列表,用户代码通常应当限制将这种商定作为己用.欲成为构造器的一局部的用户代码可以在下滑线中结合使用短前缀,例如. bobo_magic_attr .说明:命名商定应避开的名字永久不要用字符”l”(小写字母el(就是读音,下同)),”O”(大写字母oh),或”I”(大写字母eye)作为单字符的变量名.在某些字体中,这些字符不能与数字1和0分开.当想要使用”l”时,用”L”代替它.包和模块名模块应当是简短的,全小写的名字.可以在模块名中使用下划线来提高可读性.Python包名也应当是简短的,当一个用C或C++写的扩展模块有一个伴随的Python模块,这个Python模块供给了一个更高层(例如,更面对对象)的接口时,C/C++模块有一个前导下划线(如:_socket)类名几乎没有例外,类名总是使用首字母大写单词串(CapWords)的商定.特别名由于特别应当是一个类,类的标准也适用这里。无论怎样,你应当在特别名中使用后缀“Error“(假照实际是一个错误).似乎内建(扩展)的模块使用“error“(例如:os.error),而Python模块通常用“Error例如xdrlib.Error).全局变量名(让我们期望这些变量打算只被用于模块内部)这些商定与那些用于函数的商定差不多.被设计可以通过“fromMimport*“来使用的那些模块,应当使al不想被导入的全局变量(还有内部函数和类)前加一个下划线.函数名函数名应当为小写,可以将单词用下划线分开以增加可读性.mixedCase混合大小写仅被允许用于这种风格已经占优势的上下文(如threading.py)以便保持向后兼容.函数和方法参数总是使用self做实例方法的第一个参数。总是使用cls做类方法的第一个参数。假设一个函数的参数名与保存关键字冲突,最好是为参数名添加一个后置下划线而不是使用缩写或错误的拼写。因此class_比clss好。〔或许使用同义词来避开更好。〕。方法名和实例变量大体上和函数一样:使用小写单词,必要时用下划线分隔增加可读性.仅为不打算作为类的公共接口的内部方法和实例变量使用一个前导下划线.Python的名称改编规章。PythonFoo有一个属性名为a,通过Foo.a不能访问。〔执著的用户可以通过调用Foo._Fooa来访问。〕通常,两个前导下划线仅用来避开与子类的属性名冲突。留意:关于names的使用存在一些争论〔见下文〕。常量常量通常在模块级别定义,并且全部的字母都是大写,单词用下划线分开。例如MAX_OVERFLOWTOTAL。继承的设计确定类的方法和实例变量〔统称为:“属性”〕是否公开。假设有疑问,选择非公开;之后把其变成公开比把一个公开属性改成非公开要简洁。公开属性是那些你期望与你的类不相关的客户使用的,依据你的承诺来避开向后不兼容的变更。非公开属性是那些不打算被第三方使用的;你不保证非公开属性不会转变甚至被删除。此处没有使用术语“private”,由于Python中没有真正私有的属性〔没有通常的不必要的工作〕。属性的另一个类别是“API子集”〔在其它语言常被称为“protected”〕。某些类被设计为基类,要么扩展,要么修改某些方面的类的行为。在设计这样的类的时候,要留意明确哪些API基类中使用。Pythonic的指南:公开属性没有前导下划线。假设公开属性名和保存关键字冲突,给属性名添加一个后置下划线。这比缩写或拼写错误更可取。〔然而,尽管有这样的规是首选的拼写方式〕注1:参见上面对类方法的参数名的建议。对于简洁的公开数据属性,最好只暴露属性名,没有简洁的访问器/修改器方法。记住,Python为将来增加供给了一条简洁的途径,你应当觉察简洁的数据属性需要增加功能行为。在这种状况下,使用属性来隐蔽简洁数据属性访问语法后面的功能实现。注1:特性仅工作于风格的类。注2:尽量保持功能行为无副作用,尽管副作用如缓存通常是好的。注3:计算开销较大的操作避开使用特性,属性注解使调用者信任访问〔相对〕是廉价的。假设确定你的类会被子类化,并有不想子类使用的属性,考虑Python的名称改编算法,类名将被改编为属性名。当子类不无意间包括一样的属性名时,这有助于帮助避开属性名冲突。注1:留意改编名称仅用于简洁类名,假设一个子类使用一样的类名和属性名,照旧会知名字冲突。注2:名称改编会带来确定的不便,如调试和getattr。然而,名称改编算法有良好的文档,也简洁手工执行。注3:不是每个人都宠爱名称改编。尝试平衡避开意外的名称冲突和高级调用者的可能。公共和内部接口任何向后兼容性保证只适用于公共接口。因此,重要的是用户能够清楚地区分公开和内部接口。文档接口被认为是公开的,除非文档明确声明他们是临时或内部接口,免除通常的向后兼容保证。全部非文档化的接口应假定为内部接口。为了更好的支持自省,模块应当使用all属性显示声明他们公开API的名字,all设置为一个空列表表示该模块没有公开API。即使all设置的适当,内部接口〔包,模块,类,函数,属性或者其它名字〕仍应以一个前导下划线作前缀。一个接口被认为是内部接口,假设它包含任何命名空间〔包,模块,或类〕被认为是内部的。导入名被认为是实现细节。其它模块必需不依靠间接访问这个导入名,除非他们是一个明确的记录包含模块的API的一局部,例如os.path或包的init模块,从子模块暴露功能。程序设计建议编写的代码应当不损害其他方式的n〔yn,IronPython,Cython,Psyco等等〕。例如,不要依靠CPython的高效实现字符串连接的语句形式b或aa。这种优化即使在CPython里也是脆弱的〔它只适用于某些类型〕,并且在不使用引用计数的实现中它完全不存在。在库的性能易受影响的局部,应使用””.join形式。这将确保跨越不同实现的连接发生在线性时间。与单值,比方None比较,使用is或isnot,不要用等号操作符。None的变量或参数是否被置成其它的值〔例如容器。使用isnot操作符而不是not...is前者更具有可读性并且更优。好:iffooisnotNone:坏:ifnotfooisNone:当实现有丰富的比较的排序操作时,最好实现全部六个操作符〔eq

,ne

,lt

,le

,gt

,ge

〕而不是依靠其它代码只能进展一个特定的比较。为了削减所涉及的工作量,functools.total_ordering装饰器提供了一个工具来生成缺失的比较函数。PEP207说明,Python假定自反性规章。因此,编译器可以交换y>和x<>=和x<=x==和x!=y。sort和min操作保证使用<操作符并且max功能使用>操作符。不管怎样,最好实现全部六个操作,这样在其它上下文就不会产生混淆了。总是使用def语句而不是使用赋值语句绑定lambda表达式到标识符上。风格良好:deff(x):return2*x风格不良:f=lambdax:2*x第一种形式意味着所得的函数对象的名称是f‟而不是一般的<lambda>‟。这在回溯和字符串表示中更有用。赋值语句的使用消退了lambda表达式可以供给显示def声明的唯一好处〔例如它可以嵌在更大的表达式里面〕。从Exception而不是BaseException中派生出特别。直接继承BaseException是保存那些捕获几乎总是错的特别的。设计特别层次构造基于区分,代码可能需要捕获特别,而不是捕获产生特别的位置。旨在以编程方式答复以下问题“出了什么问题?”,而不是只说“问题产生了”〔参见PEP3151对这节课学习内置特别层次构造的一个例子〕类的命名规章适用于此,只是当特别确实是错误的时候,需要在特别类名添加“Error”后缀。用于非本地的流把握或其他形式的信号的非错误的特别,不需要特别的后缀。适当使用特别链。Python3中,“raiseXfromY”用来说明明确的更换而不失去原来追踪到的信息。当有意替换一个内部特别〔Python2中使用“raiseX”而Python3.3+中使用“raiseXfromNone”〕,确保相关的细节被转移到的特别中〔比方当转换KeyError为AttributeError常的文本〕。Python2中产生特别,使用raiseValueError(”message”)替换老的形式raiseValueError,”message”。后一种形式是不合法的Python3语法。目前使用的形式意味着当特别的参数很长或包含格式化字符传时,多亏了小括号,不必再使用续行符。except:子句。例如,使用:try:importplatform_specific_moduleexceptImportError:platform_specific_module=None空的except:子句将捕获SystemExit和KeyboardInterrupt异常,这使得很难用Control-C来中断程序,也会掩饰其它的问题。假设想捕获会导致程序错误的全部特别,使用exceptException:〔空特别相当于exceptBaseException:〕一条好的阅历法则是限制使用空„except‟子句的两种状况:假设特别处理程序将打印或记录跟踪;至少用户将会意识到有错误发生。raise抛出。处理这种状况用try...finally更好。Python2.6中添加的明确的名称绑定语法。try:process_dataexceptExceptionasexc:raiseDataProcessingFailedError(str(exc))这是Python3中唯一支持的语法,并避开与旧的基于逗号的语法有关的歧义问题。Python3.3引进的明确的特别层次,通过errno值自省。另外,对于全部的try/except子句,限制try子句内只有确定最少代码量。这避开掩盖错误。风格良好:try:value=collection[key]exceptKeyError:returnkey_not_found(key)else:returnhandle_value(value)风格不良:try:#很多代码returnhandle_value(collection[key])exceptKeyError:#捕获由handle_value抛出的KeyErrorreturnkey_not_found(key)当一个资源是一个局部特定的代码段,它使用后用with语句确保快速牢靠的将它清理掉。也可以使用try/finally语句。无论何时做了除了猎取或释放资源的一些操作,都应当通过单独的函数或方法调用上下文治理器。例如:风格良好:withconn.begin_transaction:do_stuff_in_transaction(conn)风格不良:withconn:do_stuff_in_transac

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论