Я пишу некоторые модульные тесты для библиотеки Python и хотел бы, чтобы некоторые предупреждения были подняты как исключения, которые я могу легко сделать с помощью simplefilter. Однако для одного теста я хотел бы отключить предупреждение, запустить тест, а затем снова включить предупреждение.
Я использую Python 2.6, поэтому я должен был это сделать с помощью catch_warnings контекстного менеджера, но он похоже, не работает для меня. Даже если это не удается, я также должен был бы вызвать resetwarnings, а затем повторно установить свой фильтр.
Вот простой пример, который иллюстрирует проблему:
>>> 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
>>>
Может кто-нибудь объяснить, как я могу это сделать?
EDIT: По-видимому, это известная ошибка: http://bugs.python.org/issue4180