Estoy escribiendo algunas pruebas de unidad para una biblioteca de Python y me gustaría que ciertas advertencias se planteen como excepciones, lo que puedo hacer fácilmente con la función simplefilter. Sin embargo, para una prueba me gustaría desactivar la advertencia, ejecutar la prueba, luego volver a habilitar la advertencia.¿Cómo desactivo y luego vuelvo a habilitar una advertencia?
Estoy usando Python 2.6, así que se supone que puedo hacer eso con el administrador de contexto catch_warnings, pero parece que no funciona para mí. Incluso si eso falla, también podré llamar al resetwarnings y luego volver a configurar mi filtro.
He aquí un ejemplo sencillo que ilustra el problema:
>>> import warnings
>>> warnings.simplefilter("error", UserWarning)
>>>
>>> def f():
... warnings.warn("Boo!", UserWarning)
...
>>>
>>> f() # raises UserWarning as an exception
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in f
UserWarning: Boo!
>>>
>>> f() # still raises the exception
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in f
UserWarning: Boo!
>>>
>>> with warnings.catch_warnings():
... warnings.simplefilter("ignore")
... f() # no warning is raised or printed
...
>>>
>>> f() # this should raise the warning as an exception, but doesn't
>>>
>>> warnings.resetwarnings()
>>> warnings.simplefilter("error", UserWarning)
>>>
>>> f() # even after resetting, I'm still getting nothing
>>>
¿Puede alguien explicar cómo puedo lograr esto?
EDIT: Al parecer se trata de un fallo conocido: http://bugs.python.org/issue4180
Parece que puede haber algún error sutil en juego en el módulo de advertencias. Estaba jugando con su código en el shell y observé que incluso declarar otras funciones donde el mensaje de advertencia era idéntico tendría el mismo efecto (sin advertencia), mientras que la alteración del mensaje de advertencia le permite funcionar. –