PYTHONWARNDEFAULTENCODINGを使おう

methane.hatenablog.jp

この記事で紹介した、 open() などでエンコーディングを指定せずに暗黙でデフォルトのエンコーディングが使われた時に EncodingWarning を発生させる機能のPEPが受理され、実装し、昨晩リリースされた Python 3.10a7 に入りました。

.bashrc などで extern PYTHONDEFAULTENCODING=1 などとしておけば、デフォルトエンコーディングを使用している箇所に警告が表示されます。自分で書いているプログラムだけでなく、利用しているツールやライブラリ、フレームワークに対する警告についても見かけたら開発元に報告してもらえると助かります。

警告を見つけた場合にどうするべきか、簡単に説明します。

UTF-8を利用している場合

MarkdownYAML、TOML、JSONを開くのに encoding 引数を指定しないのは、ほとんどの場合バグです。特定の環境で動けば良いプログラムならそのままでも大丈夫ですが、そうでない場合はWindowsでファイルに非ASCII文字が含まれているとエラーになります。 encoding="utf-8" を指定しましょう。

ロケールエンコーディングを利用している場合

Python 3.10 からは encoding="locale" を指定して Warning を解消することができますが、これをすると Python 3.9 で動かなくなります。 Python 3.9 にも対応した形でWarningを解消したい場合は encoding=locale.getpreferredencoding(False) を指定することができますが、そのまま放置しても問題ないでしょう。

将来的にデフォルトのエンコーディングUTF-8に切り替わった場合に動かなくなりますが、近い将来に切り替わる予定はありません。数年後に Python 3.9 のサポートを切ってから encoding="locale" を指定しましょう。

このブログに乗せているコードは引用を除き CC0 1.0 で提供します。