2

このことを考慮:

>>> 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?
>>>

ここでは警告はありませんが、表示されるすべての警告が表示されるはずです。Python 2 と 3 の両方で「無視」フィルタを削除すると、同じことが起こります。

原則としてこれは問題にはなりませんが (別の理由がない限り)、私はこのサイレンシング警告をいつの間にかどこかで作成しています。これにより、特定の警告コンテキスト内で警告が制御されていることを確認することが難しくなります。

注:スクリプト内では、この例は正常に機能します。ただし、私の元の問題はおそらくこの例に似ているだけなので、対話型プロンプトだけに限定されているとは思えません。warnings.filters元の問題では、最初のフィルターが「常に」と一致する必要があるにもかかわらず、警告が表示されません(私はそれを確認しました)。

4

1 に答える 1

3

わかりました。この特定の質問は、実際にはこのバグレポートによって回答されていると思います。残念ながら、それは実際には私の問題ではないようですが、それは別のことです...

warnings.filters誰かが興味を持っている場合...私の元々の問題は、正規表現を使用しre.match、文字列の先頭を一致させる必要があることを忘れたためです。

の非推奨警告をテストするときにこの問題を回避するにはfunction

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

これは少なくとも私の場合は役に立ちました。(ある警告が別の警告のテスト中に無視され、この問題が最初の無視された警告のテスト中にトリガーされました)

于 2013-01-08T12:26:27.933 に答える