Embora as respostas fornecidas funcionem para um módulo específico, elas não recarregam os submódulos, conforme observado em Esta resposta :
Se um módulo importa objetos de outro módulo usando from ... import ...
, chamar reload()
o outro módulo não redefine os objetos importados - uma maneira de contornar isso é reexecutar a instrução from, outra é usar import
nomes qualificados ( module.*name*
).
No entanto, se estiver usando a __all__
variável para definir a API pública, é possível recarregar automaticamente todos os módulos disponíveis ao público:
# Python >= 3.5
import importlib
import types
def walk_reload(module: types.ModuleType) -> None:
if hasattr(module, "__all__"):
for submodule_name in module.__all__:
walk_reload(getattr(module, submodule_name))
importlib.reload(module)
walk_reload(my_module)
As advertências observadas na resposta anterior ainda são válidas. Notavelmente, a modificação de um submódulo que não faz parte da API pública, conforme descrito pela __all__
variável, não será afetada por um recarregamento usando esta função. Da mesma forma, a remoção de um elemento de um submódulo não será refletida por uma recarga.