我正在爲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
>>>
有人能解釋我如何能做到這一點?
編輯:顯然,這是一個已知的bug:http://bugs.python.org/issue4180
看起來好像在警告模塊中可能存在一些細微的錯誤。我在shell中玩弄你的代碼,並觀察到甚至在警告消息相同的地方聲明其他函數也會有相同的效果(沒有警告),而改變警告消息可以使其工作。 – 2010-03-06 00:59:12