pass 語句
你為什麼要告訴直譯器明確無所作為?Python 具有語法要求,即程式碼塊(在 if,except,def,class 等之後)不能為空。
但有時空程式碼塊本身就很有用。一個空的 class 塊可以定義一個新的,不同的類,例如可以捕獲的異常。如果沒有任何要求寬恕的話,空的 except 區塊可以是表達請求寬恕的最簡單方式。如果迭代器完成了所有繁重的操作,那麼只執行迭代器的空 for 迴圈可能很有用。
因此,如果在程式碼塊中沒有發生任何事情,則需要 pass 來使這樣的塊不產生 IndentationError。或者,可以使用任何語句(包括僅僅要評估的術語,如 Ellipsis 文字 ... 或字串,通常是文件字串),但是 pass 清楚地表明確實沒有任何事情發生,並且不需要實際評估並(至少暫時)儲存在記憶體中。這是一個小的註釋集合,最常用的 pass 橫穿我的方式 - 連同一些關於好的和壞的實踐的評論。
-
忽略(全部或)某種型別的
Exception(例如來自xml):try: self.version = "Expat %d.%d.%d" % expat.version_info except AttributeError: pass # unknown注意: 忽略所有型別的加註,如以下來自
pandas的示例,通常被認為是不好的做法,因為它還捕獲可能傳遞給呼叫者的異常,例如KeyboardInterrupt或SystemExit(甚至HardwareIsOnFireError- 你怎麼知道的你沒有在定義了特定錯誤的自定義框上執行,某些呼叫應用程式想要了解這些錯誤?)。try: os.unlink(filename_larry) except: pass相反,使用至少
except Error:或在這種情況下優選使用except OSError:被認為是更好的練習。對我安裝的所有 python 模組的快速分析給了我超過 10%的所有except ...: pass語句捕獲所有異常,所以它仍然是 python 程式設計中的常見模式。 -
派生一個不新增新行為的異常類(例如在
scipy中):class CompileError(Exception): pass類似地,用作抽象基類的類通常具有明確的空
__init__或子類應該派生的其他方法。 (例如pebl)class _BaseSubmittingController(_BaseController): def submit(self, tasks): pass def retrieve(self, deferred_results): pass -
測試程式碼是否正確執行幾個測試值,而不關心結果(來自
mpmath):for x, error in MDNewton(mp, f, (1,-2), verbose=0, norm=lambda x: norm(x, inf)): pass -
在類或函式定義中,通常已經存在 docstring 作為要執行的強制語句作為塊中的唯一事物。在這種情況下,除了文件字串之外,塊還可以包含
pass*,*以便說“這確實是無意義的。”,例如在pebl中:class ParsingError(Exception): """Error encountered while parsing an ill-formed datafile.""" pass -
在某些情況下,
pass用作佔位符來說“這個方法/類/ if-block / …還沒有實現,但這將是它的地方”,儘管我個人更喜歡Ellipsisliteral...(注意:僅限 python-3)以便在前面的例子中嚴格區分它和故意的“no-op”。例如,如果我用大筆書寫一個模型,我可能會寫def update_agent(agent): ...別人可能有的地方
def update_agent(agent): pass之前
def time_step(agents): for agent in agents: update_agent(agent)作為提示在稍後填寫
update_agent函式,但是已經執行了一些測試以檢視程式碼的其餘部分是否按預期執行。 (這種情況的第三個選項是raise NotImplementedError。這特別適用於兩種情況: “這個抽象方法應該由每個子類實現,在這個基類中沒有通用的方法來定義它” ,或者 “這個函式,使用此名稱,尚未在此版本中實現,但這是它的簽名看起來像“ )