2014-09-20 47 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> 

请注意,这不能保证工作;并非所有的属性都是微不足道的定位。