2010-12-08 15 views
3

在交互模式下使用python,一個模塊導入一個模塊,然後如果模塊被修改(一個錯誤修復或其他),可以簡單地使用reload()命令。在python中重新導入一個函數

但是如果我沒有導入整個模塊並使用'from M import f,g'import語句。有沒有辦法重新導入g?我試着從'del g'中刪除參數表中的函數,並從目錄中刪除.pyc文件,但沒有幫助,當我重新導入函數'from M import g'時,舊的g是加載)。

+1

只需重新啓動解釋器;) – Ant 2010-12-08 10:31:01

+0

坦率地說,這就是我所做的。 – 2010-12-08 11:07:28

回答

9

當你做一個from foo import bar,你導入整個模塊。您只需在當前名稱空間中製作符號bar的副本。你是而不是只導入功能。

reload函數不完全可靠(例如,它不適用於編譯的C模塊)。我會建議你退出並重新啓動你的解釋器。

0

對於第一個導入,綁定進口片的變量(這也加快了查找):

import numpy as NP 
import numpy.linalg as LA 
    ... 
reload(LA) 
1

由於這只是用於交互式解釋,我不認爲是這樣:

def my_reload(mod, name): 
    reload(mod) 
    globals()[name] = getattr(mod, name) 

myreload(somemodule, "some_function") 

會很糟糕。這只是像正常一樣重新加載模塊,然後將指向舊對象的名稱重新綁定到新對象。這應該在reload開始工作的所有情況下都有效。或者,您可以編程它以獲取實際對象並使用其屬性__name__獲取名稱。函數,類和模塊都具有__name__屬性,但是像模塊級字典這樣的東西並不那麼靈活。

它不會取代對全球存在以外的對象的引用,但即使您最初使用虛線名稱訪問該對象,它也不會取代reload。一旦對象的引用鬆動,就沒有太多可以做的事情。