Recarregando o módulo que fornece NameError: o nome 'reload' não está definido

162

Estou tentando recarregar um módulo que já importei no Python 3. Sei que você só precisa importar uma vez e executar o importcomando novamente não fará nada.

A execução reload(foo)está dando este erro:

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

O que significa o erro?

Lonnie Price
fonte

Respostas:

239

reload é um interno no Python 2, mas não no Python 3, portanto, o erro que você está vendo é esperado.

Se você realmente deve recarregar um módulo no Python 3, use:

Alex Martelli
fonte
37
Esta resposta faz parecer que é ruim recarregar um módulo no Python 3. Qual é o pensamento por trás disso?
ABM
11
Recarregar é sempre problemático. O recarregamento das variáveis ​​do módulo de atualizações, mas não remove as antigas, portanto, se você renomear algo, o nome antigo ainda existirá. Se você alterar as definições de classe, os objetos existentes ainda terão o tipo antigo. Por fim, alguns módulos executam código no momento da importação que não foi projetado para ser executado duas vezes. Portanto, é melhor evitar recarregar, mas frequentemente muito conveniente.
Evan
13
Eu diria que muitas vezes é problemático, mas nem sempre . Para ter certeza, acho que os casos de uso válidos para escrever reloadem um script são realmente muito raros, e é improvável que aqueles que empregam esse tipo de arte obscura estejam lendo este comentário. No entanto, se você estiver desenvolvendo um módulo e usando um console IPython para testá-lo interativamente, reloadpoderá ser útil nesse fluxo de trabalho. Como o @Evan disse, no entanto, esteja atento aos efeitos colaterais do tempo de importação. Em geral, eu diria para evitar reloados módulos de outra pessoa. reloadfazer o seu próprio faz sentido durante o tempo de design.
Tim D
6
Uso o notebook Jupyter para o meu trabalho e, para manter as coisas organizadas, coloco um trabalho que deve exigir revisões mínimas em pacotes importáveis. No entanto, essas coisas às vezes precisam de revisões, e recarregar é absolutamente a coisa certa a fazer, uma vez que o kernel do meu notebook está mantendo cálculos de memória que levaram, literalmente, o dia todo para serem computados.
775 Scott
Recarregar é vital para o desenvolvimento ativo de bibliotecas com chamadas demoradas, por exemplo, funções de banco de dados. No entanto, um dos principais problemas que você pode encontrar em recarregar módulos é que as funções com decoradores tenderá a não ver recarga corretamente aqui
Alexander McFarlane
82

Para> = Python3.4:

import importlib
importlib.reload(module)

Para <= Python3.3:

import imp
imp.reload(module)

Para Python2.x:

Use a reload()função incorporada .

reload(module)
Kevin
fonte
48
import imp
imp.reload(script4)

fonte
7
Descontinuado desde o Python 3.4 - use em seu importliblugar.
Mark Amery
39

Para expandir as respostas escritas anteriormente, se você quiser uma solução única que funcione nas versões 2 e 3 do Python, use o seguinte:

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
fonte
12

Eu recomendo usar o seguinte snippet, pois ele funciona em todas as versões python (requer six):

from six.moves import reload_module
reload_module(module)
Alleo
fonte
2

Para compatibilidade com python2 e python3, você pode usar:

# Python 2 and 3
from imp import reload
reload(mymodule)
Patrick José Pereira
fonte
1
Isso funciona no Python 3.7 (e versões anteriores), mas é privado como o @Alex Martelli escreveu abaixo. Use a resposta de Alleo 'from six.moves import reload_module'
Charles Plager
2

Se você não quiser usar bibliotecas externas, uma solução é recriar o método reload do python 2 para o python 3, conforme abaixo. Use isso na parte superior do módulo (assume python 3.4+).

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

O recarregamento de BTW é muito necessário se você usar arquivos python como arquivos de configuração e quiser evitar a reinicialização do aplicativo .....

user6830669
fonte