13

__warningregistry__ロードされたすべての機能を一度にリセットする方法はありますか?

「一度」フィルターでフィルター処理されたすべての警告を強制的に再度表示したいと思います。<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()もクリアしたいと考えています。

これはすでに存在しますか?おそらく、明らかな何かが欠けているか、モジュールを間違って使用していますか?

4

3 に答える 3

6

その機能は、Python に直接存在するようには見えません。

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

ここに投稿するには少し長すぎますが、Python バグ 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__()
于 2015-07-26T16:09:26.377 に答える