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 / …還沒有實現,但這將是它的地方”,儘管我個人更喜歡Ellipsis
literal...
(注意:僅限 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
。這特別適用於兩種情況: “這個抽象方法應該由每個子類實現,在這個基類中沒有通用的方法來定義它” ,或者 “這個函式,使用此名稱,尚未在此版本中實現,但這是它的簽名看起來像“ )