Python はデフォルトで多くの警告を表示しません。これはPython開発者ではないエンドユーザーが警告を見た時に混乱するのを防ぐためです。
デフォルトで ignore される Warning は次のとおりです。 (ref: https://docs.python.org/3/library/warnings.html#default-warning-filters)
- DeprecationWarning
- PendingDeprecationWarning
- ImportWarning
- BytesWarning
- ResourceWarning
これらの warning を Python 開発者が表示しないと、せっかく使っているライブラリが長期間 Deprecation 期間を設けていてもその Warning に気づかないとかいう事が起きます。
また、 warning システムは同じ場所から発生した同じ warning を複数回表示しないとかいったフィルタリングができるようになっている関係で、通常のログなどにくらべて遅かったり、メモリを消費したりします。
例えば botocore が head_object でメモリリークするという報告を調べていたら、 socket を close していないという ResourceWarning が原因でした。
- Issue 27535: Ignored ResourceWarning warnings leak memory in warnings registries - Python tracker
- Issue 33565: strange tracemalloc results - Python tracker
- botocore leak when using get + head object · Issue #1464 · boto/botocore
こういった問題は開発者が普段から Python の -W default
(短縮形は -Wd
) オプションを利用していれば防げたはずです。
このオプションは環境変数でも指定できるので、開発マシンの .bashrc
に export PYTHONWARNINGS=default
と書いてしまうのも良いと思います。自分が開発しているのではないアプリやライブラリの Warning も、できれば報告してあげてください。
なお、 Python 3.7 からは -X dev
オプションや PYTHONDEVMODE=1
環境変数で、より性能を犠牲にしてエラー検出を強化した開発者モードを利用することができます。開発者モードでは上記の warning もデフォルトで表示されます。