元派遣プログラマの自称技術系ブログです。雑記とか自作のオープンソースプロジェクトの話とか。

argparseのhelp引数に%を書くときの注意

Pythonの引数解析ライブラリのargparseでhelp引数に%を書くと、特定条件下でパーサーが正常終了しなくなりました。

例えば、次のコードはValueErrorを出して異常終了します。

import argparse
parser = argparse.ArgumentParser(description='%%')
parser.add_argument('a',type=str, help='%')
parser.parse_args(["-h"])
:
File ~/.pyenv/versions/3.8.10/lib/python3.8/argparse.py:621, in HelpFormatter._expand_help(self, action)
    619     choices_str = ', '.join([str(c) for c in params['choices']])
    620     params['choices'] = choices_str
--> 621 return self._get_help_string(action) % params

ValueError: incomplete format

HelpFormatterクラスで%のエスケープが不完全なのが原因だと思われます。help以外の引数では、文字列に%が混じっていても問題はありませんでした。

回避方法

単純な回避方法としては、%を%%にすれば解決します。


一応githubのissueで既にマージの準備中(半年前だけど進んでいない)なので、今後更新されると%が二重に表示されるようになると思われます。
github.com

完璧な修正はCPython待ちです。