Python

Python 開発者は -W default オプションを使おう

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 が原因でした。

こういった問題は開発者が普段から Python の -W default (短縮形は -Wd) オプションを利用していれば防げたはずです。

このオプションは環境変数でも指定できるので、開発マシンの .bashrcexport PYTHONWARNINGS=default と書いてしまうのも良いと思います。自分が開発しているのではないアプリやライブラリの Warning も、できれば報告してあげてください。

なお、 Python 3.7 からは -X dev オプションや PYTHONDEVMODE=1 環境変数で、より性能を犠牲にしてエラー検出を強化した開発者モードを利用することができます。開発者モードでは上記の warning もデフォルトで表示されます。