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


Python importlib.reload用法及代碼示例


用法:

importlib.reload(module)

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

執行reload() 時:

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

還有許多其他警告:

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

try:
    cache
except NameError:
    cache = {}

重新加載內置或動態加載的模塊通常不是很有用。不建議重新加載sys__main__builtins等關鍵模塊。在許多情況下,擴展模塊不會被設計為多次初始化,並且在重新加載時可能會以任意方式失敗。

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

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

3.4 版中的新函數。

在 3.7 版中更改:ModuleNotFoundError當被重新加載的模塊缺少ModuleSpec.

相關用法


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