no判断 python yes_python 编码规范
以下为PEP 8 -- Style Guide for Python Code
一、Code lay-out 代码布局
1.每级缩进使用 4 个空格。
2.绝不要混用制表符和空格。
3.最流行的 Python 缩进方式是仅使用空格,其次是仅使用制表符。混合着制表符和空格缩进的代码将被转换成仅使用空格。使用带-t选项来调用Python命令行解释器时,代码中非法混用制表符和空格会给出警告。当使用-tt选项时这些警告就会变成错误。高度建议使用这些选项。
二、Maximum Line Length 行的最大长度
4.限制所有行的最大长度为 79 个字符。
三、Blank Lines 空行
5.顶层函数和类之间使用两个空行。
6.类的方法之间使用一个空行.
7.使用额外的空白行来分隔一组相关的函数。一堆相关的单行代码之间的空白行可以省略(例如,一组dummy implementations)。
8.在函数中使用空行来(谨慎地)表示不同的逻辑段落。
9.Python接受control-L(即^L)换页符作为空格;许多工具把这些字符当作页面分隔符,所以你可以在文件中使用它们来分隔相关段落。请注意,一些编辑器和基于Web的代码阅读器可能无法识别control-L为换页,将在其位置显示另一个字形。
四、Encodings (PEP 263) 编码
10.Python核心发行代码应该总是使用 ASCII 或 Latin-1 编码 (又名 ISO-8859-1)。Python 3.0 和以后的版本,首选 UTF-8 而不是 Latin-1,请查看 PEP 3120 获取更多信息。(ps:对中文项目,请首选UTF-8。)
11.ASCII 编码的文件不应该有coding cookie(译者注:# -*- coding: utf-8 -*-,# coding=utf-8)。Latin-1(或 UTF-8 )只应该当注释或文档字符串涉及作者名需要 Latin-1 时才使用;否则,使用 \x,\u或 \U等转义字符是在字符串中包含非 ASCII 数据的首选方法。
五、Imports 导入
12.导入通常应当使用单独的行,例如:
Yes: import os import sysNo: import sys, os
还可以这么写:
from subprocess import Popen, PIPE
13.总是位于文件的顶部,在模块注释和文档字符串之后,在模块的全局变量与常量之前。
14.导入应该按照以下的顺序分组:
(1) standard library imports 标准库导入
(2) related third party imports 相关第三方导入
(3) local application/library specific imports 本地应用程序/库的特定导入
六、Whitespace in Expressions and Statements 表达式和语句中的空格
15.在下列情况下,避免多余的空格:
紧贴着圆括号、方括号和花括号。
Yes: spam(ham[1], {eggs: 2})No: spam( ham[ 1 ], { eggs: 2 }
紧贴在逗号,分号或冒号之前:
Yes: if x == 4: print x, y; x, y = y, xNo: if x == 4 : print x , y ; x , y = y , x
紧贴在函数调用的参数列表的圆括号的开括号前:
Yes: spam(1)No: spam (1)
紧贴在索引或切片的方括号的开括号前:
Yes: dict['key'] = list[index]No: dict ['key'] = list [index]
在赋值(或其他)语句的运算符周围,不要为了对齐而使用多个空格。
Yes:x = 1y = 2long_variable = 3No:x = 1y = 2long_variable = 3
七、Other Recommendations 其他建议
16.总是在这些二元运算符前后加一个空格:赋值(=),自增赋值(+=,-= 等等), 比较(==,,!=,<>,<=,>=,in,not in,is,is not),布尔运算(and,or,not)。
在算术运算符前后加空格:
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)
17.不要在一个关键字参数或者一个缺省参数值的 = 符号前后加一个空格。
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)
18.通常不推荐使用复合语句(一行代码中有多条语句)。
Yes:if foo == 'blah': do_blah_thing()do_one()do_two()do_three()Rather not:if foo == 'blah': do_blah_thing()do_one(); do_two(); do_three()
19.通常情况下,一行代码包括一个小的if/for/while块,是可以的。但是多子句绝不可以。同样,需要避免折叠类似的长代码行!
Rather not:if foo == 'blah': do_blah_thing()for 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()
八、Comments 注释
20.不好理解的注释不如没有注释。注释要和代码保持与时俱进!
21.注释应该是一条完整的句子。如果注释是一个短语或句子,它的第一个字应该大写,除非它是一个小写字母开头的标识符(绝对不要改变标识符的大小写)。
22.如果注释很短,那么结尾的句号可以省略。块注释通常由一个或多个段落组成, 这些段落由完整的句子构成,每个句子都应该使用句号结尾。
句号结尾的句子后面应该有2个空格。
九、Block Comments 块注释
23.块注释在一些(或全部)代码之前,并和代码缩进一致。每行注释均以 # 开头,然后紧跟一个空格(除非在注释内缩进)。
块注释内的段落使用仅含 # 的单行分隔。
十、Inline Comments 行内注释
24.谨慎地使用内嵌注释
内嵌注释是一种和语句在同一行的注释。内嵌注释至少和语句间隔2个空格。他们开始于一个 # 和一个空格。
十一、Documentation Strings 文档字符串
25.所有的公告模块,函数,类和方法都需要编写文档字符串。对非公共的方法而言,文档字符串则不是必要的,但是可以使用一个注释来描述这个方法。这个注释必须位于 def 行之后。
十二、Version Bookkeeping 版本注记
26.如果在代码源文件中掺杂着Subversion,CVS或RCS注记,按照下面的规则书写。
__version__ = "$Revision: dc5a21b8bc47 $"
十三、Naming Conventions 命名约定
27.Python库的命名约定有点乱,所以我们从未达成完全一致。但是,目前有一些推荐的标准。新的模块和包(包括第三方框架)应该用这些标准,但是拥有不同风格的固有库,还是保持内部统一更好。
十四、Descriptive: Naming Styles 描述:命名风格
28.下面是常见的优秀命名方式:
b (single lowercase letter) (单个小写字母)
B (single uppercase letter) (单个大写字母)
lowercase 小写字母
lower_case_with_underscores 使用下划线分隔的小写字母
UPPERCASE 大写字母
UPPER_CASE_WITH_UNDERSCORES 使用下划线分隔的大写字母
十五、Prescriptive: Naming Conventions 说明:命名规范
29.Names to Avoid 避免使用的名字
永远不要使用 'l'(小写的L),'O'(大写的O),或者'I'(大写的I)作为单字变量名。
在某些字体中,这些字很难和数字的0 和 1 区分。当打算用'l'的时候,用'L'来代替。
30.Package and Module Names 包和模块名称
模块应该用简短的,全小写的名字。如果能增强可读性的话,可以使用下划线。Python的包也要用全小写的,短名称,但是不建议用下划线。
因为模块名称和文件名关联,而且某些文件系统大小写不敏感,也会截断过长的名字。所以模块选用相当简短的名字是很重要的。在Unix下不会有这样的问题,但是在早些的Mac、Windows 或者 DOS下会有这样的问题。
当用C或C++连编写一个含有Python模块提供更高层(比如,更加面向对象)接口的扩展模块时,这个C/C++模块要有一个前导下划线(例如 _socket)。
31.Class Names 类名
毫无例外,类名要用首字母大写的规则。内部类,要加上前导下划线。
32.Exception Names 异常名
异常也是类,所以这里也用类名规则。但是,你异常名应该用前缀 "Error"(如果你的异常确实是个错误的话)。
33.Global Variable Names 全局变量名
(我们希望这些变量只在模块内部使用)这些规则和函数规则一样。
被设计为通过from M import *导入的模块。应该用__all__机制来防止导出全局。或者使用过去的全局变量前置下划线的规则(这是为了说明这些变量是"模块私有的")。
34.Function Names 函数名
函数名应该用小写,为了增加可读性可以用下划线分隔。
大小写混合仅在为了兼容原有大小写混合风格占主体的情况下使用(比如 threading.py)。
35.Function and method arguments 函数和方法参数
始终用self作为实例方法的第一个参数。
始终用cls作为类方法的第一个参数。
如果函数的参数名和保留字冲突。用结尾下划线比缩写或是滥用的组词更好。因此 class_ 比 clss好。(也许,更好的避免冲突的方式是用同义词。)
36.Method Names and Instance Variables 方法名和实例变量
使用函数命名规则:使用下划线分隔的小写字母会提高可读性。
只在私有方法和实例变量前用单下划线。
使用前导双下划线调用Python的名字变化规则来避免与子类中的名字冲突。
Python 用类名来变化这个名字:如果类Foo有个属性叫做__a,那么它不能用 Foo.__a读取。(执着的用户还是可以用Foo._Foo__a.读取。)
注意:关于__names的使用有一些争论(见下文)。
37.Constants 常量
常量通常在模块级别中定义,用全大写和下划线分隔的字符来编写。例如MAX_OVERFLOW 和 TOTAL。
十六、Designing for inheritance 继承设计
38.总要考虑一个类的方法或实例变量(总体而言:属性)应该是公用的或者非公用的。如果不能确定的话,设计为私有的。因为,之后将一个私有的改为公有的要比将公有的变为私有的容易。
39.公有属性,是你希望与这个类无关的客户使用的,并通过你的委托机制来避免由于属性变更导致的向后不兼容。私有属性,是你不希望被第三方使用的。你不能保证私有属性不会改变甚至被删除。
在这里我们没有使用术语"private",因为在Python并没有真正的私有属性(为了避免大量不必要的常规工作)
另一种属性,是"subclass API" 的一部分(通常,在某些语言里被称作"protected")。有一些类设计的时候是用来继承的。用于扩展或者改变类的自身行为的某些方面。当设计这样的类的时候,一定要弄清楚哪些属性是公有的,哪些是subclass API的子集,哪些是真正只在自己的基类中使用的
贯穿着这样的思想,如下是Python的准则:
公有属性不应该用下划线开始。
如果你的公有属性和保留字冲突。那么在属性名后面加一个下划线。这要比缩写和糟糕的拼写好很多。(然而,尽管有这样的规则,'cls'在用作变量,或者参数时,是代表'类'的最佳选择。特别是用作类方法的第一个参数)
十七、Programming Recommendations 程序设计建议
40.代码应该用不损害其他Python实现的方式去编写(PyPy, Jython, IronPython, Cython, Psyco 等)
例如,不要依赖于CPython的高效内置字符连接语句a += b or a = a + b.这些语句在Jython中运行较慢。在性能敏感的库中,应该用''.join() 来取代。这样可以保证在不同的实现中,字符链接花费的时间都呈线性。
41.与诸如None这样的字符比较时,要使用is or is not,永远不要用等于操作。
42.同样地,在测试一个变量或参数默认值为None被设置为其他值时(比如if x表示if x is not None时),要注意。这个值应该有一个能在布尔逻辑的上下文中为false的类型(比如容器)。
43.当用复杂比较实现排序操作时,最好去实现全部六个操作(__eq__, __ne__, __lt__, __le__, __gt__, __ge__),而不是依靠其他的代码去实现一些怪异的比较。
·
为了最大程度的减少实现这一过程的开销。functools.total_ordering()提供了生成缺少的比较操作的方法。
44.在这里用到类命名规范。尽管当你的“异常”是一个“错误”(error)时,你应该在自己的异常类加上后缀"Error"。非错误类(Non-error)异常,不需要特别的后缀。
45.当抛出一个异常的时候,使用raise ValueError('message')代替旧的raise ValueError, 'message'格式。
推荐使用这种括弧的格式,当异常的参数很长或者是格式化字符串的时候,由于括号的关系,我们不需要使用连字符。旧的格式在Python 3 中被移除。
当捕获一个异常的时候,要用详细异常声明代替光秃秃的except: 语句.
try: import platform_specific_moduleexcept ImportError: platform_specific_module = None
一个空的except:语句将会捕获 SystemExit 和 KeyboardInterrrupt 异常。这会使得很难用Control-C来中断一个程序,并且还会隐藏其他的问题。如果你想捕获一个程序中的所有异常,使用except Exception: (bare 和except BaseException:是等价的)。
官网链接:https://www.python.org/dev/peps/pep-0008/