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()が無難。 ちょっとデフォルト値とオプションの定義が離れたりで見にくくなったりするかもだけれど。

参考