Python code standard
這又是一篇轉載文章, 好文章!
先給一個google推薦的規范
http://google-styleguide.googlecode.com/svn/trunk/pyguide.html
接著是Style Guide for Python Code
http://www.python.org/dev/peps/pep-0008/
啄木鳥上有中文翻譯.
http://wiki.woodpecker.org.cn/moin/PythonCodingRule
最后是正文, 轉載自http://blog.csdn.net/akara/archive/2010/08/09/5797974.aspx
[注, 用中劃線標注的觀點, 是我不太認同的]
[原創]Python編程規范
by AKara 2010-08-07 @ http://blog.csdn.net/akara @ akaras@163.com
---------------------------------------------------------------------
Python編程規范(for Python2.5 by AKara)
---------------------------------------------------------------------
源文件布局規范
---------------------------------------------------------------------
* 文件以utf-8編碼保存。
* 文件第一行svn prop:# $Id$
* 文件第二行coding約定:# -*- coding: utf-8 -*-
* 選擇4個空格進行縮進。
* 任一行代碼長度不超過70列。
* 用 # 來注釋。
* 非必要不寫docstring。
* 中文注釋。避免英文注釋。
---------------------------------------------------------------------
命名規范
---------------------------------------------------------------------
* 變量:unix風格,小寫加下劃線,如:foo_bar。
* 常量:大寫加下劃線,如:ERROR_FOO_BAR。
* 函數:和 變量 一致,如:def foo_bar(): pass
* 類:大寫C開頭的駝峰法,如:CFooBar。(是的,與python lib風格不同)
* 模塊:小寫無下劃線,如:foobar.py。
* 包:與 模塊 一致。
* "私有化"命名約定:
一個且只一個下劃線開始的命名。
表示本命名不能超過最近命名空間索引。
(不使用python的Private name mangling風格)
---------------------------------------------------------------------
比較規范
---------------------------------------------------------------------
* None:a is None
* int / str:a == 163 / a == "AKara"
* boolean:if a: / if not a:
* 杜絕比較不同類型的對象。
PS:雖然builtin的某些不同對象間是可按如下規則比較的:
(1)None最小
(2)Number次之
(3)其他類型比較類型字符串,如:"dict" < "list"
即:None < Number(int/float) < dict < list < str < tuple
但Python后續版本并不保證維持這個規則。
---------------------------------------------------------------------
import規范
---------------------------------------------------------------------
* 所有import放在module最頂部。
* 每次import只導入一個module ,如:
import akara
import evil
* 杜絕一次import多個module:import akara, evil
* 杜絕import * from a。
* 杜絕from a import b。
* 杜絕import a as b。
* 性質決定import先后:builtin > standard > engine > frozen > py。
---------------------------------------------------------------------
module規范
---------------------------------------------------------------------
* module分兩種性質:(1)數據module (2)實現module
* 數據module:只包含數據定義和初始化。
* 實現module:只包含函數或類定義。
不包含任何import時便執行的賦值或初始化(比如name = CAkara())
* __load__():執行module命名空間內的對象初始化的函數。
* __destroy__(): 執行module命名空間內的對象銷毀的函數。
* 跨模塊索引數據對象須考慮熱更新。過早優化不必要,常用a.b.var索引。
---------------------------------------------------------------------
class規范
---------------------------------------------------------------------
* class必須直接或間接繼承全局的gobject(非python內建的object)。
杜絕不繼承任何基類的類定義:如 class CFoo: pass。
* 杜絕重載類的__del__方法來進行對象析構資源回收。
添加類的destroy方法統一銷毀資源,并自行負責調用。
* 避免多繼承。
* 總是讓super來負責mro(Method resolution order)。
---------------------------------------------------------------------
其他建議
---------------------------------------------------------------------
* 安全性編碼:tuple > list,frozenset > set,__debug__,assert。
* 迭代時優先考慮iter版本的內建函數或方法,如:
xrange / enumerate / zip / iterkeys / itervalues / iteritems ...
* 適當使用:list comprehension / generator / generator expression
decorator / __slots__ ...
* 少用properties。
* 用iter模式迭代大文件的讀入。
* 考慮向下取整結果的整除操作符://。
* 大量字符串鏈接請用 "".join(str_list) 。
* 精準捕捉異常。避免不指定Exception或指定Exception基類的except捕捉。
* 如果需常用popleft語義,用collections.deque代替list。
* 性能分析模塊:hostshot > cProfile > profile。
* 善用weakref模塊管理引用。
* -OO release。
---------------------------------------------------------------------
充分理解
---------------------------------------------------------------------
* 充分理解import a的path查找和介質載入處理過程。
* 充分理解python中的命名空間和對象的關系。
* 充分理解并合理利用closure。
* 充分理解shallow copy & deep copy。
* 充分理解gc。
* import this。
---------------------------------------------------------------------
更多參考資料
---------------------------------------------------------------------
<<Style Guide for C Code>> http://www.python.org/dev/peps/pep-0007/
<<Style Guide for Python Code>> http://www.python.org/dev/peps/pep-0008/

浙公網安備 33010602011771號