欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

no判断 python yes_python 编码规范

程序员文章站 2022-05-02 08:17:04
...

以下为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/

no判断 python yes_python 编码规范