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?

questionAnswers(7)

yourAnswerToTheQuestion