web-dev-qa-db-ja.com

警告を発行し、行を無視しないようにwarnings.warnを取得するにはどうすればよいですか?

ドキュメントに示されている例に基づいたコードスニペットを使用して、DeprecationWarningを上げようとしています。 http://docs.python.org/2/library/warnings.html#warnings.warn

公式

def deprecation(message):
    warnings.warn(message, DeprecationWarning, stacklevel=2)

私の

import warnings
warnings.warn("This is a warnings.", DeprecationWarning, stacklevel=2) is None  # returns True

Stacklevel引数を削除して、負の0、2、および20000に設定しようとしました。警告は、常にサイレントに飲み込まれます。警告を発行したり、例外を発生させたりすることはありません。行を無視してNoneを返します。ドキュメントには、無視するための基準については記載されていません。メッセージを送信し、warnings.warnを正しく発行しますUserwarning.

これを引き起こしている可能性があるのは何ですか?実際に警告するように警告するにはどうすればよいですか?

23
Damgaard

ドキュメントから:

デフォルトでは、Pythonはいくつかの警告フィルターをインストールします。これらは、-Wに渡されるコマンドラインオプションとfilterwarnings()の呼び出しによってオーバーライドできます。

  • DeprecationWarningとPendingDeprecationWarning、およびImportWarningは無視されます。
  • -bオプションが1回または2回指定されない限り、BytesWarningは無視されます。この場合、この警告は出力されるか(-b)、例外になります(-bb)。

デフォルトでは、DeprecationWarningは無視されます。以下を使用してフィルターを変更できます。

warnings.simplefilter('always', DeprecationWarning)

これで、警告が出力されます。

>>> import warnings
>>> warnings.simplefilter('always', DeprecationWarning)
>>> warnings.warn('test', DeprecationWarning)
/home/guest/.env/bin/ipython:1: DeprecationWarning: test
  #!/home/guest/.env/bin/python
31
Maciej Gol

警告モジュールは、特定の条件に基づいて警告のフィルタリングを実装します。 warnings.filtersを出力すると、デフォルトのフィルターを表示できます。

$ python -c "import warnings; print(warnings.filters)"
[('ignore', None, <type 'exceptions.DeprecationWarning'>, None, 0),
 ('ignore', None, <type 'exceptions.PendingDeprecationWarning'>, None, 0),
 ('ignore', None, <type 'exceptions.ImportWarning'>, None, 0),
 ('ignore', None, <type 'exceptions.BytesWarning'>, None, 0)]

ご覧のとおり、DeprecationWarningはデフォルトで無視されます。 warnings モジュールおよび -Wコマンドラインオプション からPythonフィルタを設定するには-詳細については、ドキュメントを参照してください。

例:

$ python -Wall
Python 2.7.3 (default, Sep 26 2013, 20:03:06) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import warnings
>>> warnings.warn("test", DeprecationWarning)
__main__:1: DeprecationWarning: test
8
Sven Marnach