如果你的TODO是"將來做某事"的形式, 那么請確保你包含了一個指定的日期("2009年11月解決")或者一個特定的事件("等到所有的客戶都可以處理XML請求就移除這些代碼").
導入格式
每個導入應該獨占一行
Yes:importosimportsysNo:importos,sys
導入總應該放在文件頂部, 位于模塊注釋和文檔字符串之后, 模塊全局變量和常量之前. 導入應該按照從最通用到最不通用的順序分組:
標準庫導入
第三方庫導入
應用程序指定導入
每種分組中, 應該根據(jù)每個模塊的完整包路徑按字典序排序, 忽略大小寫.
importfoofromfooimportbarfromfoo.barimportba***romfoo.barimportQuuxfromFoobimportar語句
通常每個語句應該獨占一行
不過, 如果測試結果與測試語句在一行放得下, 你也可以將它們放在同一行. 如果是if語句, 只有在沒有else時才能這樣做. 特別地, 絕不要對?try/except?這樣做, 因為try和except不能放在同一行.
Yes:iffoo:bar(foo)No:iffoo:bar(foo)else:baz(foo)try:bar(foo)exceptValueError:baz(foo)try:bar(foo)exceptValueError:baz(foo)訪問控制
在Python中, 對于瑣碎又不太重要的訪問函數(shù), 你應該直接使用公有變量來取代它們, 這樣可以避免額外的函數(shù)調用開銷. 當添加更多功能時, 你可以用屬性(property)來保持語法的一致性.
(譯者注: 重視封裝的面向對象程序員看到這個可能會很反感, 因為他們一直被教育: 所有成員變量都必須是私有的! 其實, 那真的是有點麻煩啊. 試著去接受Pythonic哲學吧)
另一方面, 如果訪問更復雜, 或者變量的訪問開銷很顯著, 那么你應該使用像?get_foo()?和?set_foo()?這樣的函數(shù)調用. 如果之前的代碼行為允許通過屬性(property)訪問 , 那么就不要將新的訪問函數(shù)與屬性綁定. 這樣, 任何試圖通過老方法訪問變量的代碼就沒法運行, 使用者也就會意識到復雜性發(fā)生了變化.
命名
module_name, package_name, ClassName, method_name, ExceptionName, function_name, GLOBAL_VAR_NAME, instance_var_name, function_parameter_name, local_var_name.
應該避免的名稱
單字符名稱, 除了計數(shù)器和迭代器.
包/模塊名中的連字符(-)
雙下劃線開頭并結尾的名稱(Python保留, 例如__init__)
命名約定
所謂"內部(Internal)"表示僅模塊內可用, 或者, 在類內是保護或私有的.
用單下劃線(_)開頭表示模塊變量或函數(shù)是protected的(使用import * from時不會包含).
用雙下劃線(__)開頭的實例變量或方法表示類內私有.
將相關的類和頂級函數(shù)放在同一個模塊里. 不像Java, 沒必要限制一個類一個模塊.
對類名使用大寫字母開頭的單詞(如CapWords, 即Pascal風格), 但是模塊名應該用小寫加下劃線的方式(如lower_with_under.py). 盡管已經(jīng)有很多現(xiàn)存的模塊使用類似于CapWords.py這樣的命名, 但現(xiàn)在已經(jīng)不鼓勵這樣做, 因為如果模塊名碰巧和類名一致, 這會讓人困擾.
Python之父Guido推薦的規(guī)范
Type Public Internal
Modules?lower_with_under?_lower_with_under?
Packages?lower_with_under???
Classes?CapWords?_CapWords?
Exceptions?CapWords???
Functions?lower_with_under()?_lower_with_under()?
Global/Class Constants?CAPS_WITH_UNDER?_CAPS_WITH_UNDER?
Global/Class Variables?lower_with_under?_lower_with_under?
Instance Variables?lower_with_under?_lower_with_under (protected) or __lower_with_under (private)?
Method Names?lower_with_under()?_lower_with_under() (protected) or __lower_with_under() (private)?
Function/Method Parameters?lower_with_under???
Local Variables?lower_with_under???
Main?
即使是一個打算被用作腳本的文件, 也應該是可導入的. 并且簡單的導入不應該導致這個腳本的主功能(main functionality)被執(zhí)行, 這是一種副作用. 主功能應該放在一個main()函數(shù)中.
在Python中, pydoc以及單元測試要求模塊必須是可導入的. 你的代碼應該在執(zhí)行主程序前總是檢查?if __name__ == '__main__', 這樣當模塊被導入時主程序就不會被執(zhí)行.
defmain():...if__name__=='__main__':main()
所有的頂級代碼在模塊導入時都會被執(zhí)行. 要小心不要去調用函數(shù), 創(chuàng)建對象, 或者執(zhí)行那些不應該在使用pydoc時執(zhí)行的操作.
評論
查看更多