повторное импортирование одной функции в Python - PullRequest
3 голосов
/ 08 декабря 2010

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

Но что, если я не импортировал весь модуль и использовал оператор импорта from M import f, g? Есть ли способ реимпортировать только г?

(Я попытался удалить функцию из таблицы параметров с помощью «del g» И удалить файл .pyc из каталога. Это не помогло. Когда я импортировал функцию «из M import g», старый g был загружен ).

Ответы [ 4 ]

9 голосов
/ 08 декабря 2010

Когда вы делаете from foo import bar, вы импортируете весь модуль. Вы просто делаете копию символа bar в текущем пространстве имен. Вы не импортируете только функцию.

Функция reload не совсем надежна (например, она не будет работать для скомпилированных модулей Си). Я бы порекомендовал вам выйти и перезапустить ваш переводчик.

2 голосов
/ 27 ноября 2018

Для from M import f, g, где M не является официальным модулем Python, используйте:

import sys
import importlib
importlib.reload(sys.modules['M'])

затем повторно импортируйте f и g используя:

from M import f,g

Если M является официальным модулем Python, используйте

import importlib
importlib.reload(M)
from M import f,g
1 голос
/ 08 декабря 2010

Так как это только для интерактивного переводчика, я не думаю, что что-то вроде:

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

myreload(somemodule, "some_function")

было бы ужасно. Это просто перезагружает модуль как обычно, а затем привязывает имя, указывающее на старый объект, к новому объекту. Это должно работать во всех случаях, когда reload будет работать с самого начала. Кроме того, вы можете запрограммировать его так, чтобы он брал реальный объект и получал имя, используя его атрибут __name__. Все функции, классы и модули имеют атрибут __name__, но что-то вроде словаря на уровне модулей - нет, поэтому он не будет таким гибким.

Он не заменит ссылки на объекты, которые существуют, кроме глобального, но не будет reload, даже если вы изначально обращались к нему с точечным именем. Как только ссылка на объект теряется, мало что можно сделать.

0 голосов
/ 08 декабря 2010

Для первого импорта свяжите импортированный кусок с переменной (что также ускоряет поиск):

import numpy as NP
import numpy.linalg as LA
  ...
reload(LA)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...