2013-01-08 52 views
2

考慮一下:控制外型後,他們曾經supressed

>>> import warnings 
>>> warnings.filterwarnings("always", category=DeprecationWarning) 
>>> warnings.warn("Hello", DeprecationWarning) 
/usr/bin/bpython:2: DeprecationWarning: Hello 

OK了警告那裏。

>>> warnings.filterwarnings("ignore", category=DeprecationWarning) 
>>> warnings.warn("Silence", DeprecationWarning) 

這裏沒有警告。

>>> warnings.filterwarnings("always", category=DeprecationWarning) 
>>> warnings.warn("Silence", DeprecationWarning) # why remain silent? 
>>> 

這裏沒有報警,但應該是所有我看到一個警告。同樣的情況,如果刪除了「忽略」過濾器上都蟒蛇2和3

雖然原則上這不應該是一個問題,(除非還有另外一個原因),我創建了這個沉默的地方警告並沒有意識到的。這使得很難確定警告是否在給定的警告環境中受到控制。

注意:在腳本內部,這個例子工作正常。然而,我原來的問題也許只是與這個例子類似,所以我懷疑它僅限於交互式提示。在原始問題中,我看不到任何警告,即使warnings.filters中的第一個過濾器應該與「always」匹配(我檢查過)。

+1

是否要[重置警告](http://docs.python.org/2/library/ warnings.html#warnings.resetwarnings)? – mgilson

+0

@mgilson,基本上是的,但它不工作...基本上我想保存和恢復警告上下文,這使得它不工作,因爲我希望它的工作。 – seberg

+0

我無法重現你在說什麼。當我把它放在一個腳本中時,我會看到兩個警告。 – mgilson

回答

3

好的,所以我想這個具體的問題實際上是由這個bug report回答。不幸的是,似乎並不是我的問題,但這是一個不同的事情......

如果有人感興趣......我原來的問題只是由於忘記warnings.filters使用正則表達式re.match,這需要匹配的字符串的開始。

要爲function

if hasattr(function, '__globals__'): 
    if function.__globals__.has_key('__warningregistry__'): 
     function.__globals__['__warningregistry__'].clear() 

測試廢棄警告時,爲了避免這個問題,這有助於至少在我的情況。 (在測試另一個警告時忽略了一個警告,然後在測試第一個忽略的警告期間觸發此問題)

+0

非常感謝您分享這個黑客!只有Python2受到影響。 – marscher