2013-10-17 13 views
12

一度にロードされたすべての機能の__warningregistry__をリセットする方法はありますか?Python - 一度警告を表示する(すべての警告レジストリをリセットする)

「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のバグです。http://bugs.python.org/issue21724 –

答えて

2

少なくとも2.7.6ではなく、この機能が存在するとは思いません。 warnings.pyと_warnings.cを調べましたが、これを行うために使用できるものは何も見つかりませんでした。

は、私はおそらくあなたがモジュールをラップし、グローバルを入れて warn()コールをオーバーライドする()[「__ warningregistry__」]リストで、ループにそれを新しい clear()機能を追加し、すべてのコールのためにレジストリをリセットする可能性が考えていました。

5

この機能はPythonでは直接存在しないようです。

しかし、自分のライブラリのユニットテストにも同様の機能が必要でしたし、プロセス全体の警告レジストリ状態をバックアップし、クリアしてから、コンテキストが完了した後に復元するコンテキストマネージャーを開発しました。

それはここに投稿することが少し長すぎるのですが、私はあなたがダウンロードし、以下のとおりであるhttp://bugs.python.org/file40031/reset_warning_registry.py

使い方から直接それを使用することができるはずですので、python bug 21724を解決するための潜在的な出発点として、それを提出しました:

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