當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python imp.reload用法及代碼示例


用法:

imp.reload(module)

重新加載以前導入的 module 。參數必須是一個模塊對象,所以它必須之前已經成功導入。如果您使用外部編輯器編輯了模塊源文件並且想要在不離開 Python 解釋器的情況下試用新版本,這將非常有用。返回值是模塊對象(與module 參數相同)。

reload(module) 執行時:

  • 重新編譯 Python 模塊的代碼並重新執行 module-level 代碼,定義一組新的對象,這些對象綁定到模塊字典中的名稱。擴展模塊的init函數不會被第二次調用。
  • 與 Python 中的所有其他對象一樣,舊對象僅在其引用計數降至零後才會被回收。
  • 模塊命名空間中的名稱被更新以指向任何新的或更改的對象。
  • 對舊對象的其他引用(例如模塊外部的名稱)不會重新引用以引用新對象,並且如果需要,必須在它們出現的每個命名空間中進行更新。

還有許多其他警告:

重新加載模塊時,會保留其字典(包含模塊的全局變量)。重新定義名稱將覆蓋舊定義,因此這通常不是問題。如果模塊的新版本沒有定義舊版本定義的名稱,則舊定義仍然存在。如果模塊維護一個全局表或對象緩存,則此函數可用於模塊的優勢 - 使用 try 語句,它可以測試表的存在並在需要時跳過其初始化:

try:
    cache
except NameError:
    cache = {}

除了 sys__main__builtins 之外,重新加載內置或動態加載的模塊通常不是很有用,但這是合法的。然而,在許多情況下,擴展模塊不會被設計為多次初始化,並且在重新加載時可能會以任意方式失敗。

如果一個模塊使用 from ... import ... 從另一個模塊導入對象,則為另一個模塊調用 reload() 不會重新定義從它導入的對象 — 解決此問題的一種方法是重新執行 from 語句,另一種方法是使用 import 和限定名稱 (module .*name*)。

如果一個模塊實例化了一個類的實例,重新加載定義該類的模塊不會影響實例的方法定義——它們會繼續使用舊的類定義。派生類也是如此。

在 3.3 版中更改:兩者都依賴__name____loader__在重新加載的模塊上定義,而不僅僅是__name__.

自 3.4 版起已棄用:采用importlib.reload反而。

相關用法


注:本文由純淨天空篩選整理自python.org大神的英文原創作品 imp.reload。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。