2014-09-20 42 views
1

後的模塊我知道,一個模塊可以重新加載通過發出:刷新變化

reload(module_name) 

假設我不導入整個模塊,但只是其中的功能。

from module_name import one_function 

如何在更改該功能時重新加載該特定功能。

在此先感謝。

+0

爲什麼不重新加載整個模塊?爲什麼你只想重新加載一個函數? – Nilesh 2014-09-20 12:58:35

+1

順便說一句,當你使用'from module_name import one_function'時,**整個模塊**被加載,就像'import module_name'一樣。唯一的區別是名稱被添加到全局名稱空間中。 – unutbu 2014-09-20 13:02:39

+0

Lafada,這引發了一個NameError。 我沒有明確導入模塊(即導入) – bergercookie 2014-09-20 13:44:01

回答

2

您必須重新導入一個名稱才能重新綁定它;您可以在sys.modules到達緩存模塊對象:

reload(sys.modules['module_name']) 
from module_name import one_function 
1

您可以使用inspect.getmodule獲得擁有一個功能模塊:

import inspect 
from math import sqrt 
from importlib import reload 

math = reload(inspect.getmodule(sqrt)) 
sqrt = math.sqrt 

使用__qualname__可以自動完成這一過程:

def reload_attr(attribute): 
    obj = reload(inspect.getmodule(attribute)) 
    for name in attribute.__qualname__.split("."): 
     try: 
      obj = getattr(obj, name) 
     except NameError: 
      raise ValueError("Unable to find attribute.") 
    return obj 

reload_attr(sqrt) 
#>>> <built-in function sqrt> 

請注意,這不能保證工作;並非所有的屬性都是微不足道的定位。