2014-09-20 3 views
1

Я знаю, что модуль может быть перезагружен путем выдачи:Обновить модуль после изменения

reload(module_name) 

Предположим, что я не импортировать весь модуль, но только одна функция этого.

from module_name import one_function 

Как вы можете перезагрузить эту конкретную функцию, когда вы внесли в нее изменения.

Заранее спасибо.

+0

Почему бы не перезагрузить весь модуль? Почему вы хотите перезагрузить только одну функцию? – Nilesh

+1

Кстати, когда вы используете 'from module_name import one_function', загружается ** весь модуль **, как и' import module_name'. Единственное различие заключается в том, какие имена добавляются в глобальное пространство имен. – unutbu

+0

Lafada, это вызывает имяError. Я не импортировал явно модуль (например, импорт ) – bergercookie

ответ

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> 

Обратите внимание, что это не гарантируется; не все атрибуты тривиальны для поиска.