Ricarica modulo dando NameError: il nome 'ricaricare' non è definito


162

Sto provando a ricaricare un modulo che ho già importato in Python 3. So che devi importare solo una volta ed eseguire importnuovamente il comando non farà nulla.

L'esecuzione reload(foo)sta dando questo errore:

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

Cosa significa l'errore?

Risposte:


239

reload è incorporato in Python 2, ma non in Python 3, quindi è previsto l'errore visualizzato.

Se devi veramente ricaricare un modulo in Python 3, dovresti usare:


37
Questa risposta fa sembrare che sia male ricaricare un modulo in Python 3. Qual è il pensiero dietro questo?
ABM,

11
Il ricaricamento è sempre problematico. Il ricaricamento aggiorna le variabili del modulo, ma non rimuove quelle vecchie, quindi se si rinomina qualcosa il vecchio nome rimarrà comunque. Se si modificano le definizioni di classe, gli oggetti esistenti avranno comunque il vecchio tipo. Infine, alcuni moduli eseguono codice al momento dell'importazione che non è progettato per essere eseguito due volte. Quindi è meglio evitare di ricaricare, ma spesso molto conveniente.
Evan,

13
Direi che è spesso problematico, ma non sempre . A dire il vero, penso che i casi d'uso validi per scrivere reloadin una sceneggiatura siano davvero molto rari, e è improbabile che coloro che impiegano quel tipo di arte oscura leggano questo commento. Tuttavia, se si sta sviluppando un modulo e si utilizza una console IPython per testarlo in modo interattivo, reloadpuò essere utile in quel flusso di lavoro. Come ha detto @Evan, però, fai attenzione agli effetti collaterali dei tempi di importazione. In generale, direi di evitare reloadi moduli di qualcun altro. reloadil tuo ha senso durante la fase di progettazione.
Tim D,

6
Uso il taccuino Jupyter per il mio lavoro e, per mantenere le cose in ordine, ho messo il lavoro che dovrebbe richiedere revisioni minime in pacchetti imponibili. Tuttavia, a volte queste cose necessitano di revisioni e il ricaricamento è assolutamente la cosa giusta da fare, dal momento che il kernel del mio notebook tiene in memoria calcoli che hanno richiesto letteralmente tutto il giorno per essere calcolati.
Scott,

Il ricaricamento è vitale per lo sviluppo attivo delle librerie con chiamate che richiedono tempo, ad es. Funzioni di database. Tuttavia, uno dei problemi principali che puoi incontrare nel ricaricare i moduli è che le funzioni con i decoratori tenderanno a non ricaricarsi correttamente, vedi qui
Alexander McFarlane,

82

Per> = Python3.4:

import importlib
importlib.reload(module)

Per <= Python3.3:

import imp
imp.reload(module)

Per Python2.x:

Usa la reload()funzione integrata .

reload(module)

48
import imp
imp.reload(script4)

7
Obsoleto da Python 3.4 - usa importlibinvece.
Mark Amery,

39

Per espandere le risposte precedentemente scritte, se si desidera un'unica soluzione che funzioni con le versioni 2 e 3 di Python, è possibile utilizzare quanto segue:

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

Consiglio di utilizzare il seguente frammento in quanto funziona in tutte le versioni di Python (richiede six):

from six.moves import reload_module
reload_module(module)

2

Per la compatibilità di python2 e python3, è possibile utilizzare:

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

1
Funziona in Python 3.7 (e precedenti), ma è deprecato come ha scritto @Alex Martelli di seguito. Usa la risposta di Alleo 'from six.moves import reload_module'
Charles Plager,

2

Se non si desidera utilizzare librerie esterne, una soluzione è ricreare il metodo di ricarica da Python 2 per Python 3 come di seguito. Usalo nella parte superiore del modulo (presuppone python 3.4+).

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

La ricarica BTW è molto richiesta se si utilizzano file Python come file di configurazione e si desidera evitare il riavvio dell'applicazione .....

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.