Перезагрузить компонент из модуля в Python3

Этот вопрос похож на [ Python: перезагрузить компонент Y, импортированный с 'из X import Y'? ]. Однако явно перезагрузка не работает в Python3.

У меня изначально было

from vb2GP import vb_Estep

Однако из-за ошибки я изменил vb_Estep. Когда я пытаюсь перезагрузить с помощью importlib.reload(vb_Estep) Я получаю ошибку:

  File "<ipython-input-61-72416bca3a93>", line 1, in <module>
    importlib.reload(vb_Estep)

  File "/Users/sachin/anaconda/lib/python3.5/importlib/__init__.py", line 139, in reload
    raise TypeError("reload() argument must be module")

TypeError: reload() argument must be module

Я даже пытался importlib(vb2GP.vb_Estep) где я получаю ошибку NameError: name 'vb2GP' is not defined, что имеет смысл, так как я никогда не импортировал vb2GP для начала.

Итак, вопрос в том, как перезагрузить компоненты в Python3, используя importlib,

1 ответ

Решение

reload Используемая вами функция работает только с модулями, а не с объектами, импортированными из них. Чтобы использовать его, вам нужно будет импортировать vb2GP сначала позвони reload на объекте модуля, затем извлеките перезагруженный vb_Estep значение из новой версии модуля.

import importlib

import vb2GP                      # import the old version of the module
vb2GP = importlib.reload(vb2GP)   # reload it
vb_Estep = vb2GP.vb_Estep         # get a reference to the value in the reloaded module

Но это может и не быть необходимым, в зависимости от того, как именно вы "изменили" текущий vb_Estep значение. Если у вас есть только отскок имени к новому значению, вы можете просто повторно импортировать старое, не делая никаких reloadвообще (просто используйте from vb2GP import vb_Estep снова). Только если вы изменили значение на месте (например, изменив его содержимое или атрибуты без повторного связывания самого имени переменной), reload код выше будет необходимо.

Другие вопросы по тегам