Python 编码规范

一、文件编码

所有的 Python 脚本文件都应在文件头部指定如下标识或其兼容格式的标识:

# -*- coding: utf-8 -*-

二、注释

注释分为两类,以 # 开头的“真正的”注释,和 docstring。前者一般用于说明实现的原理及难点,后者用于说明使用方法、示例以及单元测试。

坚持适当注释原则。对不存在技术难点的代码坚持不注释,对存在技术难点的代码必须注释。

三、格式

注释

以 # 开头的注释,在 # 符号后加空格,再写注释内容。对于行内注释,在语句后空出至少2格,再加注释部分。

缩进

Python 严格依赖缩进来确定代码块的层次。可以使用空格或者 Tab 来缩进代码。一般地,一个缩进层次采用 4 个空格。

空格

代码中适当加入空格可增强代码的可读性。

(1) 在二元算术、逻辑运算符、赋值运算符前后加空格:

a = b + c

算术运算符左右一般要加空格;但复杂表达式中,优先级高一些的部分,算术运算符左右不加空格:

x = x*2 - 1  # 乘号的优先级高
c = (a+b) * (a-b)  # 括号部分的优先级高一些

(2) 冒号(:)用在行尾时前后皆不加空格,如分支、循环、函数和类定义语言;用在非行尾时右边加空格,如 dict 对象的定义:

d = {'key': 'value'}

(3) 括号(含圆括号、方括号和花括号)前后不加空格,作为分隔符的逗号后加空格:

do_something(arg1, arg2)

函数定义及调用时的形参赋值,等号左右不加空格:

def complex(real, imag=0.0):
    return magic(r=real, i=imag)

(4) 逗号后面加一个空格,前面不加空格。

空行

适当的空行有利于增加代码的可读性,加空行可以参考如下几个准则:

  • 在类、函数的定义间加空行
  • 在 import 不同种类的模块间加空行
  • 在函数中的逻辑段落间加空行,即把相关的代码紧凑写在一起,作为一个逻辑段落,段落间以空行分隔
断行

一般地,行的最大长度不超过 78 个字符。可以使用括号(包括圆括号、方括号、花括号)和反斜线来断行,在断行后增加一个缩进。

四、命名

常量

常量名所有字母大写,由下划线连接各个单词。

APP_REQUEST_TIMEOUT = 600
变量
  • 变量名全部小写,由下划线连接各个单词
  • 私有类成员使用单一下划线前缀标识
  • 变量名不应带有类型信息,因为 Python 是动态类型语言。如 iValue、names_list、dict_obj 等都不是好的命名
函数

函数名的命名规则与变量名相同。

类名采用 Pascal 命名法。单词首字母大写,不使用下划线连接单词,也不加入 C、T 等前缀。

模块

模块名全部小写,对于包内使用的模块,可以加一个下划线前缀。注意不要与内置的模块名重复,否则会导致内置模块不可用。

包的命名规范与模块相同。

五、语句

import

import 的次序,先 import Python 内置模块,再 import 第三方模块,最后 import 自己开发的项目中的其它模块;用空行分隔这几类模块。

一条 import 语句只导入一个模块。

当从模块中 import 多个对象且超过一行时,使用如下断行法(此语法 py2.5 以上版本才支持):

from module import (obj1, obj2, obj3, obj4, 
    obj5, obj6)

不要使用 from module import *,除非是 import 常量定义模块或其它你确保不会出现命名空间冲突的模块。

赋值

不要做无谓的对齐:

a        = 1                  # 这是一个行注释
variable = 2                  # 另一个行注释
fn       = callback_function  # 还是行注释

没有必要做这种对齐,原因有两点:一是这种对齐会打乱编程时的注意力,大脑要同时处理两件事(编程和对齐);二是以后阅读和维护都很困难,因为人眼的横向视野很窄,把三个字段看成一行很困难,而且维护时要增加一个更长的变量名也会破坏对齐。直接这样写为佳:

a = 1 # 这是一个行注释  
variable = 2 # 另一个行注释  
fn = callback_function # 还是行注释
分支和循环

(1) 不要写成一行,如:

if not flg: pass 

应该这样:

if not flg:  
    pass  

(2) 条件表达式的编写应该足够 pythonic,如以下形式的条件表达式是拙劣的:

if len(alist) != 0: do_something()
if s != "": do_something()
if var != False: do_something()

应该这样:

if seq: do_something() # 注意,这里命名也更改了
if var: do_something()

注:本文主要参考赖勇浩的《简明Python编程规范v2》。

标签: python

添加新评论