Moduł przeładowujący podający NameError: nazwa „reload” nie jest zdefiniowana

162

Próbuję przeładować moduł, który już zaimportowałem w Pythonie 3. Wiem, że wystarczy zaimportować raz, a importponowne wykonanie polecenia nic nie da.

Wykonywanie reload(foo)powoduje ten błąd:

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

Co oznacza błąd?

Lonnie Price
źródło

Odpowiedzi:

239

reload jest wbudowany w Pythonie 2, ale nie w Pythonie 3, więc oczekiwany jest błąd, który widzisz.

Jeśli naprawdę musisz ponownie załadować moduł w Pythonie 3, powinieneś użyć:

Alex Martelli
źródło
37
Ta odpowiedź sprawia, że ​​wydaje się, że ponowne ładowanie modułu w Pythonie 3 jest złe. Jaki jest tego zamysł?
ABM
11
Ponowne ładowanie jest zawsze problematyczne. Ponowne załadowanie aktualizuje zmienne modułu, ale nie usuwa starych, więc jeśli zmienisz nazwę, stara nazwa nadal będzie istnieć. Jeśli zmienisz definicje klas, istniejące obiekty będą nadal miały stary typ. Wreszcie, niektóre moduły uruchamiają kod w czasie importu, który nie jest przeznaczony do uruchamiania dwukrotnie. Dlatego lepiej unikać przeładowywania, ale często jest to bardzo wygodne.
Evan,
13
Powiedziałbym, że często jest to problematyczne, ale nie zawsze . Z pewnością uważam, że ważne przypadki użycia pisania reloadw scenariuszu są rzeczywiście bardzo rzadkie, a osoby używające tego rodzaju mrocznej sztuki raczej nie przeczytają tego komentarza. Jeśli jednak tworzysz moduł i używasz konsoli IPython do interaktywnego testowania, reloadmoże to być przydatne w tym przepływie pracy. Jak jednak powiedział @Evan, uważaj na skutki uboczne importu. Ogólnie rzecz biorąc, powiedziałbym, żeby unikać reloadmodułów innych osób. reloadtworzenie własnych ma sens w czasie projektowania.
Tim D
6
Używam notatnika Jupyter do mojej pracy i aby zachować porządek, umieszczam prace wymagające minimalnych poprawek w importowanych pakietach. Jednak te rzeczy czasami wymagają poprawek, a ponowne załadowanie jest absolutnie właściwą rzeczą, ponieważ jądro mojego notebooka przechowuje w pamięci obliczenia, które zajmowały dosłownie cały dzień.
Scott
Ponowne ładowanie jest niezbędne do aktywnego rozwoju bibliotek z czasochłonnymi wywołaniami, np. Funkcjami bazy danych. Jednak jednym z głównych problemów, które możesz napotkać podczas przeładowywania modułów, jest to, że funkcje z dekoratorami będą miały tendencję do niepoprawnego ponownego ładowania. Zobacz tutaj
Alexander McFarlane,
82

Dla> = Python3.4:

import importlib
importlib.reload(module)

Dla <= Python3.3:

import imp
imp.reload(module)

W przypadku Python2.x:

Użyj wbudowanej reload()funkcji.

reload(module)
Kevin
źródło
48
import imp
imp.reload(script4)

źródło
7
Przestarzałe od Pythona 3.4 - użyj importlibzamiast tego.
Mark Amery,
39

Aby rozwinąć wcześniej napisane odpowiedzi, jeśli potrzebujesz jednego rozwiązania, które będzie działać we wszystkich wersjach Pythona 2 i 3, możesz użyć następujących:

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
Joey Wilhelm
źródło
12

Polecam użycie następującego fragmentu kodu, ponieważ działa we wszystkich wersjach Pythona (wymaga six):

from six.moves import reload_module
reload_module(module)
Alleo
źródło
2

Aby uzyskać zgodność z python2 i python3, możesz użyć:

# Python 2 and 3
from imp import reload
reload(mymodule)
Patrick José Pereira
źródło
1
Działa to w Pythonie 3.7 (i wcześniejszych), ale jest pozbawione, jak napisał @Alex Martelli poniżej. Użyj odpowiedzi Alleo „from six.moves import reload_module”
Charles Plager,
2

Jeśli nie chcesz używać bibliotek zewnętrznych, jednym z rozwiązań jest ponowne utworzenie metody reload z pythona 2 dla pythona 3, jak poniżej. Użyj tego w górnej części modułu (zakłada Python 3.4+).

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

BTW przeładowanie jest bardzo wymagane, jeśli używasz plików Pythona jako plików konfiguracyjnych i chcesz uniknąć ponownego uruchamiania aplikacji .....

user6830669
źródło