Модуль перезавантаження, що дає NameError: ім'я 'reload' не визначено


162

Я намагаюся перезавантажити модуль, який я вже імпортував у Python 3. Я знаю, що вам потрібно імпортувати лише один раз, а виконання importкоманди знову нічого не зробить.

Виконання reload(foo)видає цю помилку:

Traceback (most recent call last):
    File "(stdin)", line 1, in (module)
    ...
NameError: name 'reload' is not defined

Що означає помилка?

Відповіді:


239

reload є вбудованим в Python 2, але не в Python 3, тому помилка, яку ви бачите, очікується.

Якщо ви справді повинні перезавантажити модуль в Python 3, вам слід скористатися будь-яким:


37
Ця відповідь звучить так, ніби погано перезавантажувати модуль на Python 3. Що думає за цим?
ABM

11
Перезавантаження завжди проблематично. Перезавантаження змінних модулів оновлень, але не видаляє старі, тому, якщо ви перейменовуєте щось, старе ім’я все одно буде існувати. Якщо ви зміните визначення класів, існуючі об'єкти все ще матимуть старий тип. Нарешті, деякі модулі виконують код під час імпорту, який не призначений для запуску двічі. Тому краще уникати перезавантаження, але часто дуже зручно.
Еван

13
Я б сказав, що це часто проблематично, але не завжди . Безумовно, я думаю, що reloadсправжні випадки використання для запису сценарію справді дуже рідкісні, і ті, хто використовує таке темне мистецтво, навряд чи прочитають цей коментар. Однак якщо ви розробляєте модуль і використовуєте консоль IPython для інтерактивного тестування, то це reloadможе бути зручним у цьому робочому процесі. Як сказав @Evan, слідкуйте за побічними ефектами часу імпорту. Взагалі, я б сказав, щоб не уникати reloadчужих модулів. reloadУ вас є сенс під час проектування.
Тім Д

6
Я використовую ноутбук Юпітера для своєї роботи, а для того, щоб все було впорядковано, я розміщував роботи, які потребують мінімальних переглядів у пакунки, що імпортуються. Однак іноді такі речі потребують доопрацювання, і перезавантаження - це абсолютно правильна річ, оскільки ядро ​​мого ноутбука проводить обчислення пам’яті, які займають, буквально, цілий день для обчислення.
Скотт

Перезавантаження є життєво важливим для активного розвитку бібліотек, що вимагають трудомістких дзвінків, наприклад, функцій бази даних. Однак однією з головних проблем, з якою можна зіткнутися при перезавантаженні модулів, є те, що функції з декораторами, як правило, не перезавантажуватимуться належним чином
Олександр Макфарлайн

82

Для> = Python3.4:

import importlib
importlib.reload(module)

Для <= Python3.3:

import imp
imp.reload(module)

Для Python2.x:

Використовуйте вбудовану reload()функцію.

reload(module)

48
import imp
imp.reload(script4)

7
Застаріло з Python 3.4 - використовуйте importlibзамість цього.
Марк Амері

39

Щоб розширити раніше написані відповіді, якщо вам потрібно єдине рішення, яке буде працювати в версіях 2 і 3 Python, ви можете скористатися наступним:

try:
    reload  # Python 2.7
except NameError:
    try:
        from importlib import reload  # Python 3.4+
    except ImportError:
        from imp import reload  # Python 3.0 - 3.3

12

Я рекомендую використовувати наступний фрагмент, оскільки він працює у всіх версіях python (потрібно six):

from six.moves import reload_module
reload_module(module)

2

Для сумісності python2 та python3 ви можете використовувати:

# Python 2 and 3
from imp import reload
reload(mymodule)

1
Це працює в Python 3.7 (і раніше), але оприлюднено, як @Alex Martelli писав нижче. Скористайтеся відповіддю Аллео "від six.moves import reload_module"
Чарльз

2

Якщо ви не хочете використовувати зовнішні libs, то одним із варіантів є відтворити метод перезавантаження з python 2 для python 3, як показано нижче. Використовуйте це у верхній частині модуля (передбачається, python 3.4+).

import sys
if(sys.version_info.major>=3):
    def reload(MODULE):        
        import importlib
        importlib.reload(MODULE)

Перезавантаження BTW дуже потрібне, якщо ви використовуєте файли python як конфігураційні файли та хочете уникнути перезавантаження програми .....

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.