2013-10-17 52 views
12

是否有一種方法可以一次性重置所有加載函數的__warningregistry__Python - 再次顯示'once'警告(重置所有警告註冊表)

我想強制所有使用'once'過濾器過濾的警告再次顯示。我發現沒有辦法做到這一點,除了呼籲我已加載的每個功能(包括那些導入模塊的一部分)<func>.__globals__['__warningregistry__'].clear()

所以,我想要的東西就像一個warnings.clear()函數做下面的事情:

>>> import warnings 
>>> warnings.warn('blah') 
WARNING:root:blah ->UserWarning at ... 
>>> warnings.warn('blah') 
>>> warnings.clear() 
>>> warnings.warn('blah') 
WARNING:root:blah ->UserWarning at ... 

而且我想這個warnings.clear()功能也很清楚所有警告登記處,而不僅僅是當前的名字空間。

這是否已經存在?也許我錯過了一些明顯的東西,或者錯誤地使用了模塊?

+1

這裏是Python的bug跟蹤問題:http://bugs.python.org/issue21724 –

回答

2

我不相信這個功能存在,至少不是在2.7.6。我查看了warnings.py和_warnings.c文件,但沒有發現任何可用於執行此操作的內容。

我想也許你可能會打包該模塊並覆蓋調用將globals()['__ warningregistry__']放入列表中,並添加一個新的clear()函數來循環它並重置所有調用的註冊表。

5

該功能似乎並不直接存在於Python中。然而,我需要類似的功能爲我自己的圖書館的單元測試,並建立了一個上下文管理器,爲整個進程備份警告註冊表狀態,清除它,然後在上下文完成後恢復它。

這是一個有點太長,張貼在這裏,但我已經提交了它作爲一個潛在的起點解決python bug 21724,所以你應該能夠下載並直接從http://bugs.python.org/file40031/reset_warning_registry.py

用法如下使用它:

from reset_warning_registry import reset_warning_registry 

with reset_warning_registry(): 
    ... do things with clear registry ... 

# alternately, to just clear the warnings w/o restoring 
reset_warning_registry().__enter__() 
+0

尼斯,我有需要這一點。 – woot