argparseで--limitと--no-limitのような相互排他なオプションの定義の仕方のメモ
ドキュメントを見れば分かることだけれど、たまに忘れるので。
import argparse def parse(argv=None): parser = argparse.ArgumentParser() limit_group = parser.add_mutually_exclusive_group() limit_group.add_argument("--limit", dest="limit", type=int) limit_group.add_argument("--no-limit", dest="limit", action="store_const", conost=None) parser.set_defaults(limit=100) return parser.parse_args(argv)
結果
print(parse(["--limit", "100"])) # Namespace(limit=100) print(parse(["--limit", "50"])) # Namespace(limit=50) print(parse(["--no-limit"])) # Namespace(limit=None) print(parse(["--no-limit", "--limit", "50"])) # error: argument --limit: not allowed with argument --no-limit
詳細
parse_args後の値を決めるのはdest
オプション名と異なる名前で値を挿入したい場合にはdestをつける
まじめに相互排他にするならadd_mutually_exclusive_group()を使う
なくても動くけれど、2つのオプションを同時に使おうとしたときにどのような挙動になるのか不安になるので。
default値はset_defaults()をつけるとより安全
実際のところは、add_argument()にdefaultオプションを付けても良いけれど。複数の値を見る可能性がある場合(今回の場合は--limit
と--no-limit
がlimitを見る)には、set_defaults()が無難。
ちょっとデフォルト値とオプションの定義が離れたりで見にくくなったりするかもだけれど。