2

docoptを使用して cli 仕様を作成しましたが、これはうまく機能しますが、何らかの理由でそれを argparse に書き直す必要があります。

Usage:
    update_store_products <store_name>...
    update_store_products --all

    Options:
      -a --all     Updates all stores configured in config

どうやってするか?

重要なことは、次のようなものを持ちたくないということです。

update_store_products [--all] <store_name>...

むしろ次のようになると思います。

update_store_products (--all | <store_name>...)

add_mutually_exclusive_groupを使用しようとしましたが、エラーが発生しました:

ValueError: mutually exclusive arguments must be optional
4

1 に答える 1

10

まず、エラーを再現するために必要な最短のコードを質問自体に含める必要があります。それがなければ、答えは暗闇の中の一撃に過ぎません。

さて、私はあなたのargparse定義が次のように見えることに賭けても構わないと思っています:

parser = ArgumentParser()
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument('--all', action='store_true')
group.add_argument('store_name', nargs='*')

相互に排他的なグループの引数はオプションである必要があります。これは、グループがその引数しか持てないため、必須の引数をそこに持つことはあまり意味がないためです。引数が本当にオプションであることをミューテックスグループに納得させるには、作成されたアクションの属性nargs='*'だけでは十分ではありません。あなたがしなければならないことは、デフォルトを追加することです:requiredTrue

parser = ArgumentParser()
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument('--all', action='store_true')
group.add_argument('store_name', nargs='*', default=[])

これにより、次のようになります。

[~]% python2 arg.py
usage: arg.py [-h] (--all | store_name [store_name ...])
arg.py: error: one of the arguments --all store_name is required

[~]% python2 arg.py --all
Namespace(all=True, store_name=[])

[~]% python2 arg.py store1 store2 store3
Namespace(all=False, store_name=['store1', 'store2', 'store3'])
于 2016-04-25T06:38:08.290 に答える