愚蠢得使用一致性是無知的妖怪(A Foolish Consistency is the Hobgoblin of Little Minds)html
呆板的堅持一致性是傻的沒邊了!-- Zoomq
(Code lay-out)python
(Indentation)程序員
(Tabs or Spaces)api
(Maximum Line Length)服務器
1 class Rectangle(Blob): 2 def __init__(self, width, height, 3 color='black', emphasis=None, highlight=0): 4 if width == 0 and height == 0 and \ 5 color == 'red' and emphasis == 'strong' or \ 6 highlight > 100: 7 raise ValueError, "sorry, you lose" 8 if width == 0 and height == 0 and (color == 'red' or 9 emphasis is None): 10 raise ValueError, "I don't think so" 11 Blob.__init__(self, width, height, 12 color, emphasis, highlight)
(Blank Lines)cookie
(Encodings)(PEP 263)app
Python 2.4 之後內核支持 Unicode 了!不論什麼狀況使用 UTF-8 吧!這是王道!
--ZoomQuiet框架
(Imports)socket
No: import sys, os Yes: import sys import os
from types import StringType, ListType
from MyClass import MyClass from foo.bar.YourClass import YourClass
import MyClass import foo.bar.YourClass
即便用"MyClass.MyClass"和"foo.bar.YourClass.YourClass"編輯器
(Whitespace in Expressions and Statements)
"spam( ham[ 1 ], { eggs: 2 } )". Always write this as "spam(ham[1], {eggs: 2})".
緊挨着圓括號,方括號和花括號的,如:"spam( ham[ 1 ], { eggs: 2 } )". 要始終將它寫成"spam(ham[1], {eggs: 2})".
"if x == 4 : print x , y ; x , y = y , x". Always write this as "if x == 4: print x, y; x, y = y, x".
"if x == 4 : print x , y ; x , y = y , x". 要始終將它寫成 "if x == 4: print x, y; x, y = y, x".
緊貼着函數調用的參數列表前開式括號(open parenthesis )的,如"spam (1)".要始終將它寫成"spam(1)".
slicing, as in: "dict ['key'] = list [index]". Always write this as "dict['key'] = list[index]".
"dict ['key'] = list [index]".要始終將它寫成"dict['key'] = list[index]".
1 x = 1 2 y = 2 3 long_variable = 3
1 x = 1 2 y = 2 3 long_variable = 3
(Other Recommendations)
始終在這些二元運算符兩邊放置一個空格:賦值(=), 比較(==, <, >, !=, <>, <=,>=, in, not in, is, is not), 布爾運算 (and, or, not).
* 按你的見解在算術運算符周圍插入空格. 始終保持二元運算符兩邊空格的一致.
1 def complex(real, imag=0.0): 2 return magic(r=real, i=imag)
No: if foo == 'blah': do_blah_thing() Yes: if foo == 'blah': do_blah_thing() No: do_one(); do_two(); do_three() Yes: do_one() do_two() do_three()
(Comments)
我就是堅持所有使用中文來註釋,真正要發佈腳本工具時,再想E文的;開發時每一瞬間都要用在思量中,堅定不用在E文語法,單詞的回憶中!
-- ZoomQUiet
約定使用統一的文檔化註釋格式有利於良好習慣和團隊建議!-- CodeCommentingRule
(Block Comments)
(Inline Comments)
x = x+1 # Increment x
x = x+1 # Increment x
x = x+1 # Compensate for border
x = x+1 # Compensate for border
(Documentation Strings)
PEP 257. 應該一直遵照編寫好的文檔字符串(又名"docstrings")的約定(?實在不知道怎麼譯)
Documentation Strings-- 文檔化字符 ;爲配合 pydoc;epydoc,Doxygen等等文檔化工具的使用,相似於MoinMoin 語法,約定一些字符,以便自動提取轉化爲有意義的文檔章節等等文章元素!-- Zoomq
PEP 257 描述了好的文檔字符串的約定.必定注意,多行文檔字符串結尾的""" 應該單獨成行,例如:
"""Return a foobang Optional plotz says to frobnicate the bizbaz first. """
實際上Python 自個兒就使用文檔化編碼維護着全部內置對象的使用說明\不信的話常試: #python>>> import time>>> dir(time)['__doc__', '__file__', '__name__', 'accept2dyear', 'altzone', 'asctime', 'clock', 'ctime', 'daylight', 'gmtime', 'localtime', 'mktime', 'sleep', 'strftime', 'strptime', 'struct_time', 'time', 'timezone', 'tzname', 'tzset']>>> help(time.time)Help on built-in function time in module time:time(...) time() -> floating point number Return the current time in seconds since the Epoch. Fractions of a second may be present if the system clock provides them.
(Version Bookkeeping) (我以爲叫"註記"更好)
1 __version__ = "$Revision: 1.4 $" 2 # $Source: E:/cvsroot/python_doc/pep8.txt,v $
對於CVS的服務器工做標記更應該在代碼段中明確出它的使用如:在文檔的最開始的版權聲明後應加入以下版本標記:# 文件:$id$# 版本: $Revision$這樣的標記在提交給配置管理服務器後,會自動適配成爲相應的字符串,如:# 文件:$Id: ussp.py,v 1.22 2004/07/21 04:47:41 hd Exp $# 版本: $Revision: 1.4 $----HD
(Naming Conventions)
(Descriptive: Naming Styles)
CapitalizedWords(首字母大寫單詞串) (或 CapWords, CamelCase -- 這樣命名是因爲它的字母錯落有致的樣子而來的.
這有時也被看成StudlyCaps. 如:GetName
mixedCase (混合大小寫串)(與首字母大寫串不一樣之處在於第一個字符是小寫如:getName)
Capitalized_Words_With_Underscores(帶下劃線的首字母大寫串) (醜陋!)
os.stat()函數返回一個tuple, 他的元素傳統上有象st_mode, st_size, st_mtime等等這樣的名字.X11庫的全部公開函數以X開頭.
(在Python中,這個風格一般認爲是沒必要要的, 由於屬性和方法名以對象做前綴,而函數名以模塊名做前綴.)
"Tkinter.Toplevel(master, class_='ClassName')".
__double_leading_underscore(雙下劃線): 從Python 1.4起爲類私有名.
__double_leading_and_trailing_underscore__: 特殊的(magic) 對象或屬性,存在於用戶控制的(user-controlled)名字空間, 例如:__init__, __import__ 或 __file__. 有時它們被用戶定義, 用於觸發某個特殊行爲(magic behavior)(例如:運算符重載); 有時被構造器(infrastructure)插入,以便本身使用或爲了調試. 所以,在將來的版本中,構造器(鬆散得定義爲Python解釋器和標準庫) 可能打算創建本身的魔法屬性列表,用戶代碼一般應該限制將這種約定做爲己用. 欲成爲構造器的一部分的用戶代碼能夠在下滑線中結合使用短前綴,例如. __bobo_magic_attr__.
(Prescriptive: Naming Conventions)
(Names to Avoid)
O'(大寫字母oh),或I'(大寫字母eye)做爲單字符的變量名. 在某些字體中,這些字符不能與數字1和0分開.當想要使用'l'時,用'L'代替它.
(Module Names)
(Class Names)
幾乎沒有例外,類名老是使用首字母大寫單詞串(CapWords)的約定.
(Exception Names)
趨勢彷佛是傾向使用CapWords異常名.
(Global Variable Names)
(Function Names)
mixedCase僅被容許用於這種風格已經佔優點的上下文(如: threading.py) 以便保持向後兼容.
(Method Names and Instance Variables)
若是類Foo有一個屬性名爲 __a, 它不能以Foo.__a訪問. (執著的用戶(An insistent user)仍是能夠經過Foo._Foo__a獲得訪問權.) 一般,雙前導下劃線應該只用來避免與類(爲能夠子類化所設計)中的屬性發生名字衝突.
(Designing for inheritance)
(Programming Recommendations)
1 class MessageError(Exception): 2 """Base class for errors in the email package."""
No: if foo[:3] == 'bar': Yes: if foo.startswith('bar'):
No: if type(obj) is type(1): Yes: if isinstance(obj, int):
1 if isinstance(obj, basestring):
在Python 2.2 類型模塊爲此定義了StringTypes類型, 例如:
1 from types import StringTypes 2 if isinstance(obj, StringTypes):
1 from types import StringType, UnicodeType 2 if isinstance(obj, StringType) or \ 3 isinstance(obj, UnicodeType) :
No: if greeting == True: Yes: if greeting: No: if greeting == True: Yes: if greeting: