💭

PythonのConfigParserで%%を含む文字列を読み込んだら%になった

2021/05/28に公開

環境: Python3.8で確認しましたが、特にバージョンを限定せずに起きるかと

先に結論だけ書いておきますと、ConfigParserはデフォルトでBasicInterpolation()関数を使っているため、%%は%に変換されます。ConfigParser(interpolation=None)でベタ書きが読めるようになります。

ConfigParserでiniファイルを読み込んで実行するときに、ソースコードに直に書いたものと挙動が変わることがありました。

中身を覗いてみたところ、%%の部分が%と、一つ減っておりました。
本件についてTweetしたところ、@takanoryさんからコメントを頂きました。
https://twitter.com/takanory/status/1397747846443540480

要はConfigParserはデフォルトでBasicInterpolation()を使って%(home_dir)の様な文字列を変数として解釈しています。ExtendedInterpolationというのも指定できまして、こちらは${section:variable}の形式で変数として解釈される様です。

話を戻しまして、BasicInterpolationで%自体を読みたい場合は、%%と%を前に置くことで読み込みできます。元が%%なら%%%%ですね。

今回の場合はプログラムに詳しくない人がiniファイルに接続変数を書くことがあるため、interpolation=Noneをプログラム側で指定して下手に解釈されないようにしました。

Discussion

ログインするとコメントできます