Impedir que o Python armazene em cache os módulos importados
Enquanto desenvolvia um projeto grande (dividido em vários arquivos e pastas) em Python com IPython, me deparei com os problemas dos módulos importados em cache.
O problema é que as instruçõesimport module
só lê o módulo uma vez, mesmo que esse módulo tenha sido alterado! Portanto, cada vez que altero algo no meu pacote, tenho que sair e reiniciar o IPython. Doloroso.
Existe alguma maneira de forçar corretamente o recarregamento de alguns módulos? Ou, melhor, de alguma forma, impedir que o Python os armazene em cache?
Eu tentei várias abordagens, mas nenhuma funciona. Em particular, encontro bugs muito, muito estranhos, como alguns módulos ou variáveis que se tornam misteriosamente iguais aNone
...
O único recurso sensato que encontrei éRecarregando Módulos Python, do pyunit, mas não o verifiquei. Eu gostaria de algo assim.
Uma boa alternativa seria o IPython reiniciar ou reiniciar o interpretador Python de alguma forma.
Então, se você desenvolve em Python, que solução encontrou para esse problema?
Editar
Para deixar as coisas claras: obviamente, eu entendo que algumas variáveis antigas, dependendo do estado anterior do módulo, podem permanecer. Tudo bem para mim. Por que é tão difícil no Python forçar o recarregamento de um módulo sem que ocorram todos os tipos de erros estranhos?
Mais especificamente, se eu tiver meu módulo inteiro em1 Arquivomodule.py
então o seguinte funciona bem:
import sys
try:
del sys.modules['module']
except AttributeError:
pass
import module
obj = module.my_class()
Esse trecho de código funciona muito bem e eu posso desenvolver sem sair do IPython por meses.
Contudo, sempre que meu módulo é composto por vários submódulos, o inferno se abre:
import os
for mod in ['module.submod1', 'module.submod2']:
try:
del sys.module[mod]
except AttributeError:
pass
# sometimes this works, sometimes not. WHY?
Por que isso é tão diferente para o Python, se eu tenho meu módulo em um arquivo grande ou em vários submódulos? Por que essa abordagem não funcionaria?