2014年9月

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》。

PHP 运行模式

PHP 主要有四种运行模式

  1. CGI 模式
  2. FastCGI 模式
  3. CLI 模式
  4. Module 模式

CGI 模式

CGI 的全称为 Common Gateway Interface,即通用网关接口。它是一种描述 Web 服务器与应用处理程序之间传输数据格式的协议。

作为 PHP 的一种运行模式,它是比较陈旧的,现在几乎不再使用。每有一个用户请求,都会创建一个子进程,然后处理请求,处理完后结束这个子进程。(也称为 Fork-And-Execute 模式)

根据原理可以看出,这种模式无法处理高并发的场景。同一时间,用户请求增多,会产生大量子进程,导致服务器资源紧张,直到崩溃。

FastCGI 模式

是 CGI 模式的升级版,它不会每个请求都 Fork 一个子进程,而是创建一个或多个常驻的子进程。这些子进程在处理完一个请求后,不会结束掉自己,而是等待或者处理后续的请求。因此也叫常驻型 CGI。这可以显著降低进程创建与进程销毁所耗的资源,以及 CGI 子进程启动后初始化的时间。

PHP-FPM(PHP-FastCGI Process Manager)是 PHP 语言中实现了 FastCGI 协议的进程管理器,它随 PHP 源码一起编译、安装。

通常 Nginx 使用这种模式运行 PHP。

CLI 模式

CLI 的全称为 Command Line Interface,即命令行接口。PHP 默认会安装,通过 php -v 命令可以看到 cli 字样。

php -r <code> 运行 PHP 代码,不需要加开始与结束标记(<? 和 ?>)
php -f <file> 运行 PHP 文件。其中参数 -f 可以省略,即 php 命令后直接输入文件名。

Module 模式

是将 mod_php5 模块集成到 Web Server 软件中,来运行 PHP。

通常 Apache 使用这种模式运行 PHP。需要在 httpd.conf 中配置:

LoadModule php5_module modules/mod_php5.so

当请求 .php 文件时,Apache 就会调用 php5_module 来解析 PHP 脚本。

附加知识

PHP 的运行模式,也可以称为 SAPI,全称为 Server Application Programming Interface, 即服务端应用编程接口。SAPI 为 PHP 提供了一个和外部通信的接口。PHP 通过 SAPI 与其它程序进行数据交换。针对不同的应用场景,PHP 提供了多种不同的 SAPI,如 apache、apache2filter、apache2handler、cli、cgi、embed 、fast-cgi、isapi 等等。

可通过 php_sapi_name() 函数获取 Web 服务器与 PHP 之间的接口类型,也可通过常量 PHP_SAPI 获取,它们返回相同的值。

还可以在 phpinfo() 中查看到使用了哪种 Server API。