18

argparse で次のようなロジックを実装したいと思います。

If argument A is selected, the user cannot select arguments B or C.
B and C can both be selected

これはadd_mutually_exclusive_group私が望んでいるように見えますが、相互に排他的なグループから1つのオプションしか選択できないように見えるため、3つすべてを相互に排他的なグループに入れることはできません.

argparseでこれを行う方法はありますか?

4

3 に答える 3

5

では実際にはできませんでしたが、 を実行argparseした後でargparse実行できます。

次に例を示します。

parser = argparse.ArgumentParser()

# group 1 
parser.add_argument("-q", "--query", help="query", required=False)
parser.add_argument("-f", "--fields", help="field names", required=False)

# group 2 
parser.add_argument("-a", "--aggregation", help="aggregation",
                    required=False)

ここでは、mongodb を照会するためにコマンド ライン ラッパーに指定されたオプションを使用しています。collectionインスタンスは、メソッドaggregateまたはfindオプションの引数queryandを使用してメソッドを呼び出すことができます。fieldsしたがって、最初の 2 つの引数が互換性があり、最後の引数が互換性がない理由がわかります。

だから今、私はそれを実行parser.parse_args()して内容を確認します:

args = parser().parse_args()

print args.aggregation
if args.aggregation and (args.query or args.fields):
    print "-a and -q|-f are mutually exclusive ..."
    sys.exit(2)

もちろん、この小さなハックは単純なケースでのみ機能し、相互に排他的なオプションとグループが多数ある場合、すべての可能なオプションをチェックするのは悪夢になります。その場合、オプションをコマンド グループに分割する必要があります。そのためには、 Python argparse Mutual Exclusive groupの提案に従う必要があります。

于 2014-12-28T10:33:22.283 に答える
-1

A の意味を否定してから、サブパーサーを使用できます。サブパーサーを使用すると、「A が選択されている場合にのみ、ユーザーは B または C を選択できる」と指定できます。

http://docs.python.org/2/library/argparse.html

于 2013-01-05T00:45:23.023 に答える