起因:
我們在學(xué)習(xí) python 的時候融蹂,經(jīng)常性的會用到 Ipython,進(jìn)行函數(shù)的測試旺订,但是我們會經(jīng)常性的遇到調(diào)試函數(shù),反復(fù)的修改函數(shù)超燃,所以需要重新載入函數(shù)耸峭,大部分的新手,都是重新打開 IPython 淋纲,然后重新導(dǎo)入函數(shù)劳闹,反復(fù)重復(fù)的操作,今天我們學(xué)習(xí)一種新的方法 洽瞬,利用 importlib
file
importlib 使用說明
importlib.reload(module)
重新加載之前導(dǎo)入的 module本涕。那個參數(shù)必須是一個模塊對象,所以它之前必須已經(jīng)成功導(dǎo)入了伙窃。這樣做是有用的菩颖,如果使用外部編輯器編已經(jīng)輯過了那個模塊的源代碼文件并且想在退出 Python 解釋器之前試驗這個新版本的模塊。函數(shù)的返回值是那個模塊對象(如果重新導(dǎo)入導(dǎo)致一個不同的對象放置在 sys.modules 中为障,那么那個模塊對象是有可能會不同)晦闰。
當(dāng)執(zhí)行 reload() 的時候:
- Python 模塊的代碼會被重新編譯并且那個模塊級的代碼被重新執(zhí)行,通過重新使用一開始加載那個模塊的 [loader]鳍怨,定義一個新的綁定在那個模塊字典中的名稱的對象集合呻右。擴(kuò)展模塊的
init
函數(shù)不會被調(diào)用第二次。 - 與Python中的所有的其它對象一樣鞋喇,舊的對象只有在它們的引用計數(shù)為0之后才會被回收声滥。
- 模塊命名空間中的名稱重新指向任何新的或更改后的對象。
- 其他舊對象的引用(例如那個模塊的外部名稱)不會被重新綁定到引用的新對象的侦香,并且如果有需要落塑,必須在出現(xiàn)的每個命名空間中進(jìn)行更新。
現(xiàn)在我們測試一下 importlib :
首先我們新建 a 模塊罐韩,結(jié)構(gòu)如下:
file
init.py 代碼如下:
file
新打開一個 Ipython 命令行憾赁,導(dǎo)入 a 模塊:
file
現(xiàn)在我們重新修改一下 print_hello_world 函數(shù):
file
利用 importlib 重新載入一下 print_hello_world
file
以后我們就不用反復(fù)的重新啟動Ipython 重新的導(dǎo)入模塊了