pass 語句

你為什麼要告訴直譯器明確無所作為?Python 具有語法要求,即程式碼塊(在 ifexceptdefclass 等之後)不能為空。

但有時空程式碼塊本身就很有用。一個空的 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 的示例,通常被認為是不好的做法,因為它還捕獲可能傳遞給呼叫者的異常,例如 KeyboardInterruptSystemExit(甚至 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。這特別適用於兩種情況: “這個抽象方法應該由每個子類實現,在這個基類中沒有通用的方法來定義它” ,或者 “這個函式,使用此名稱,尚未在此版本中實現,但這是它的簽名看起來像“