2010-12-08 1 views
3

Использование python в интерактивном режиме позволяет импортировать модуль, а затем, если модуль изменен (исправление ошибки или что-то еще), можно просто использовать команду reload().Реимпорт одной функции в python

Но что делать, если я не импортировал весь модуль и не использовал операцию импорта из m import f, g. Есть ли способ реимпортировать только g?

(Я попытался удалить функцию из таблицы параметров с помощью 'del g' и удалить файл .pyc из каталога. Это не помогло. Когда я повторно импортировал функцию 'из 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, даже если вы изначально обращались к нему с пунктирным именем. Когда ссылка на объект будет свободна, вы не можете многое сделать.

Смежные вопросы