Python 编码规范

一切编程规范的宗旨是为了代码的可读性和易维护性。

参考 : http://www.python.org/dev/peps/pep-0008/

一、缩进:

  1. 每一级缩进使用4个空格。
  2. 续行内容应该与括号内的内容垂直对齐,或使用悬挂式缩进。
  3. 不要混用tab和空格。首选只用空格、其次选只用tab。
  4. 把每行限定在79个字符。
  5. 在类定义和顶级函数之间留出两个空行。 类中每个函数之间留出一个空行。 额外的空行可用来分离相关的几组函数。 几个关系紧密的函数之间可以不用空行。 使用空行来分离函数内部不同的段。
  6. Python核心应使用ASCII或Latin-1(即ISO-8859-1)来编码。 使用非ASCII编码应在文件首部声明。 Python 3.0之后推荐使用UTF-8。

二、 导入

  1. 导入时每个模块时单独使用一行
  2. 导入应该放在源码文件的模块说明后面,在模块全局变量和常量的前面。导入的顺序:
    1. 标准库模块;
    2. 相关的第三方库模块;
    3. 本地模块 应该在不同类型的导入之间留空格。说明放在所有的导入之后。
  3. 包路径使用绝对路径,而不是相对路径。

三、 表达式和语句中的空白

  1. 避免以下无关的空白:
    • 紧跟在括号内部的
      • Yes: spam(ham[1], {eggs: 2})
      • No: spam( ham[ 1 ], { eggs: 2 } )
    • 逗号、冒号和分号之前的
      • Yes: if x == 4: print x, y; x, y = y, x
      • No: 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 = 1
          y = 2
          long_variable = 3
      • No:
        • x = 1
          y = 2
          long_variable = 3
  2. 其它的建议
    • 在以下二元运算符两边各加一个空格
      • assignment (),
        augmented assignment (+=, -= etc.),
        comparisons (==, <, >, !=, <>, <, >, in, not in, is, is not),
        Booleans (and, or, not)
    • 在算数操作符两旁加上空格
    • 在设置参数默认值或指示关键值时=号两边不要加空格
    • 不鼓励在一行中使用多个语句

三、 注释

注释应该是完整的句子,且首字母大写。 如果一条注释很短,可以不加句号。 每条句子之间用两个空格隔开。

  1. 块注释
    • 每行块注释用“#+空格”开始。
    • 块注释内分段用只包含#的单独一行隔开
  2. 内联注释
    • 少使用内联注释。
    • 内联注释跟在代码那行的后面,使用两个以上的空格加上"#+空格"

四、 文档

见PEP 257

为所有开放的模块、函数、类和 方法书写文档。

私有方法可以不加,但是要说明方法的作用。

五、 版本标签

__version__ = "$Revision: 00f8e3bb1197 $"
# $Source$

六、 命名规则

不限制使用常用命名规则,如:

  • b (single lowercase letter)
  • B (single uppercase letter)
  • lowercase
  • lower_case_with_underscores
  • UPPERCASE
  • UPPER_CASE_WITH_UNDERSCORES
  • CapitalizedWords (or CapWords, or CamelCase — so named because of the bumpy look of its letters4). This is also sometimes known as StudlyCaps.

    Note: When using abbreviations in CapWords, capitalize all the letters of the abbreviation. Thus HTTPServerError is better than HttpServerError.

  • mixedCase (differs from CapitalizedWords by initial lowercase character!)
  • Capitalized_Words_With_Underscores (ugly!)

  1. 避免以下字符做单字符变量名:
    • 1, I, O
  2. 包和模块名
    • 模块名应该短,并且全部小写。如果可以增加可读性,可以加入下划线。
    • 包名同模块名,但不鼓励使用下划线。
    • 如果扩展模块使用C或C++编写,则模块名使用下划线开始。
  3. 类名
    • 除了异常,类名使用CapWords方式。
    • 内部类在类名前加上下划线。
  4. 异常名
    • 异常名应该分类,并且包含“Error”字符。
  5. 全局变量名
    • 只在模块内使用的全局变量名和函数名命名规则相同。
    • 使用"from M import *"的方式导入的模块应避免输出全局变量,或在全局变量前加下划线做前缀。
  6. 函数名
    • 函数名应全部小写并使用下划线隔开各单词(如lower_case_with_underscores)
    • mixedCase的形式可以在继承前面代码风格的源码里。
  7. 函数和方法参数
    • 始终使用'self'作为实例化方法的第一个参数。
    • 始终使用'cls'作为静态方法的第一个参数。
    • 当参数名与保留字冲突时,推荐在参数名后加下划线(最好避免冲突)。
  8. 方法名和实例变量
    • 使用函数的命名规则:小写、下滑线分单词
    • 私有函数和变量前加下划线。
    • 为避免和子类命名冲突,公开的属性名前加两个下划线。(?)
  9. 常量
    • 常量名全部大写,使用下划线分开其内单词。
  10. 继承的设计

七、 编程建议

  1. 代码应该写的规范已利于其他Python的实现。
  2. 单个比较应该使用'is'或者'is not',而不是' '。
  3. 当实现比较操作符时,最好实现全部6个(__eq__, __ne__, __lt__, __le__, __gt__,__ge__)
  4. 使用基于类的异常。关于异常,略。
  5. 使用''.startswith()和''.endwith()代替字符串数组操作。
  6. 测试对象类型时,使用isinstance()
    • Yes: if isinstance(obj, int):
    • No: if type(obj) is type(1):

      注意Python basestring类型和unicode类型!!!

  7. 测试队列长度时(strings, lists, tuples),使用以下:
    • Yes: if not seq:
      if seq:
    • No: if len(seq)
      if not len(seq)
  8. string类型不要用空格作为结尾标志。
  9. 布尔类型比较时不要使用==
    • Yes: if greeting:
    • No: if greeting == True:
    • Worse: if greeting is True:

发表评论