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?

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ć:


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)

48
import imp
imp.reload(script4)

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

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)

2

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

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

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 .....

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.