概要
文件和sockets镣典,todo注釋钢坦,導(dǎo)入格式竹伸,語(yǔ)句笛坦,訪問(wèn)控制粒梦,命名晦嵌,Main
內(nèi)容
文件和sockets
在文件和sockets結(jié)束時(shí)候同辣,顯示的關(guān)閉它 除了文件之外拷姿,sockets或其他類似文件的對(duì)象在沒(méi)有必要的情況下打開(kāi),會(huì)有很多副作用: 1可能會(huì)消耗有限的系統(tǒng)資源旱函,如文件描述符响巢,如果這些資源在使用后沒(méi)有及時(shí)歸還系統(tǒng),用于處理這些對(duì)象的代碼會(huì)將資源消耗殆盡 2持有文件將會(huì)阻止文件的其他操作棒妨,比如移動(dòng)刪除之類 3僅僅從邏輯上關(guān)閉文件和sockets踪古,它們?nèi)匀豢赡軙?huì)被共享的程序進(jìn)行讀寫(xiě)操作 幻想當(dāng)文件對(duì)象析構(gòu)時(shí), 文件和sockets會(huì)自動(dòng)關(guān)閉, 試圖將文件對(duì)象的生命周期和文件的狀態(tài)綁定在一起的想法, 都是不現(xiàn)實(shí)的. 因?yàn)橛腥缦略? 1沒(méi)有任何方法可以確保運(yùn)行環(huán)境會(huì)真正的執(zhí)行文件的析構(gòu). 不同的Python實(shí)現(xiàn)采用不同的內(nèi)存管理技術(shù), 比如延時(shí)垃圾處理機(jī)制. 延時(shí)垃圾處理機(jī)制可能會(huì)導(dǎo)致對(duì)象生命周期被任意無(wú)限制的延長(zhǎng). 2對(duì)于文件意外的引用,會(huì)導(dǎo)致對(duì)于文件的持有時(shí)間超出預(yù)期(比如對(duì)于異常的跟蹤, 包含有全局變量等).
使用with語(yǔ)句管理文件:
with open("hello.txt") as hello_file:
for line in hello_file:
print line
對(duì)于不支持with語(yǔ)句的類似文件的對(duì)象,使用contextlib.closing():
import contextlib
with contextlib.closing(urllib.urlopen("http://www.python.org/")) as front_page:
for line in front_page:
print line
TODO注釋
為臨時(shí)代碼使用todo注釋券腔,是一種短期解決方案 TODO注釋?xiě)?yīng)該在所有開(kāi)頭處包含”TODO”字符串, 緊跟著是用括號(hào)括起來(lái)的你的名字, email地址或其它標(biāo)識(shí)符. 然后是一個(gè)可選的冒號(hào). 接著必須有一行注釋, 解釋要做什么. 主要目的是為了有一個(gè)統(tǒng)一的TODO格式, 這樣添加注釋的人就可以搜索到(并可以按需提供更多細(xì)節(jié)). 寫(xiě)了TODO注釋并不保證寫(xiě)的人會(huì)親自解決問(wèn)題. 當(dāng)你寫(xiě)了一個(gè)TODO, 請(qǐng)注上你的名字. 如果你的TODO是”將來(lái)做某事”的形式, 那么請(qǐng)確保你包含了一個(gè)指定的日期(“2009年11月解決”)或者一個(gè)特定的事件(“等到所有的客戶都可以處理XML請(qǐng)求就移除這些代碼”).
# TODO(kl@gmail.com): Use a "*" here for string repetition.
# TODO(Zeke) Change this to use relations.
導(dǎo)入格式
每個(gè)導(dǎo)入應(yīng)該獨(dú)占一行 導(dǎo)入總應(yīng)該放在文件頂部, 位于模塊注釋和文檔字符串之后, 模塊全局變量和常量之前. 導(dǎo)入應(yīng)該按照從最通用到最不通用的順序分組: 1標(biāo)準(zhǔn)庫(kù)導(dǎo)入 2第三方庫(kù)導(dǎo)入 3應(yīng)用程序指定導(dǎo)入 每種分組中, 應(yīng)該根據(jù)每個(gè)模塊的完整包路徑按字典序排序, 忽略大小寫(xiě)
語(yǔ)句
通常每個(gè)語(yǔ)句應(yīng)該獨(dú)占一行 不過(guò), 如果測(cè)試結(jié)果與測(cè)試語(yǔ)句在一行放得下, 你也可以將它們放在同一行 如果是if語(yǔ)句, 只有在沒(méi)有else時(shí)才能這樣做. 特別地, 絕不要對(duì) try/except這樣做, 因?yàn)閠ry和except不能放在同一行.
訪問(wèn)控制
在python中伏穆,對(duì)于瑣碎的不太重要的訪問(wèn)函數(shù),使用公有變量來(lái)取代它們 這樣可以避免額外的函數(shù)調(diào)用開(kāi)銷(xiāo)纷纫, 當(dāng)增加更多功能時(shí)候枕扫,可以用屬性property來(lái)保持語(yǔ)法的一致性 另一方面,如果訪問(wèn)更復(fù)雜辱魁,或者變量的訪問(wèn)開(kāi)銷(xiāo)很顯著.那么你應(yīng)該使用像 get_foo()和set_foo()這樣的函數(shù)調(diào)用烟瞧,如果之前的代碼行為允許通過(guò)屬性訪問(wèn),那么 就不要將新的訪問(wèn)函數(shù)和屬性綁定染簇,這樣参滴,任何試圖通過(guò)老方法訪問(wèn)變量的代碼就沒(méi)法運(yùn)行,使用者也就意識(shí)到復(fù)雜性發(fā)生了變化
命名
module_name package_name ClassName method_name ExceptionName
function_name GLOBAL_VAR_NAME instance_var_name
function_parameter_name local_var_name
應(yīng)該避免的名稱 單字符名稱锻弓,除了計(jì)數(shù)器和迭代器 包/模塊名中的連字符- 雙下劃線開(kāi)頭并結(jié)尾的名稱(python保留砾赔,例如__init__)
命名約定: 1所謂內(nèi)部internal表示僅模塊內(nèi)可用,或者青灼,在類內(nèi)是保護(hù)或者私有的 2 用單下劃線開(kāi)頭表示模塊變量或函數(shù)是protected的(使用import * from 時(shí)候不會(huì)包含) 3用下劃線__開(kāi)頭的實(shí)例變量或方法表示類內(nèi)私有 4將相關(guān)的類和頂級(jí)函數(shù)放在同一個(gè)模塊中 5對(duì)類名使用大寫(xiě)字母開(kāi)頭的單詞 模塊名應(yīng)該用小寫(xiě)加下劃線的方式暴心,
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/Class Variables | lower_with_under | |
Local Variables | lower_with_under |
Main
即使是一個(gè)打算被當(dāng)作腳本的文件,也應(yīng)該是可以導(dǎo)入的聚至,并且簡(jiǎn)單的導(dǎo)入不應(yīng)該導(dǎo)致這個(gè)腳本的主功能main functionality被執(zhí)行酷勺,這是一種副作用,主功能應(yīng)該放在一個(gè)main()函數(shù)中 在Python中, pydoc以及單元測(cè)試要求模塊必須是可導(dǎo)入的. 你的代碼應(yīng)該在執(zhí)行主程序前總是檢查if __name__ == '__main__', 這樣當(dāng)模塊被導(dǎo)入時(shí)主程序就不會(huì)被執(zhí)行. 所有的頂級(jí)代碼在模塊導(dǎo)入時(shí)都會(huì)被執(zhí)行. 要小心不要去調(diào)用函數(shù), 創(chuàng)建對(duì)象, 或者執(zhí)行那些不應(yīng)該在使用pydoc時(shí)執(zhí)行的操作.