2

に触発されました。これが私のアラームアプリの一部です:

parser = argparse.ArgumentParser()

group = parser.add_mutually_exclusive_group()

group.add_argument(
    '--time',
    metavar="HH:MM:SS",
    help='time in 24 hour format separated by colon'
)

group.add_argument(
    '--show',
    action='store_true',
    help='show the list of set alarms'
)

alarm = parser.parse_args()

if alarm.time:
    writeTimeToTheDatabase()

if alarm.show:
    extractTimeFromDatabase()

--これは、両方の引数からを削除するとすぐに、この時点で非常にうまく機能します。ValueError次のようなものを取得します。

Traceback (most recent call last):
  File "./alarm.py", line 65, in <module>
    help='time in 24 hour format separated by colon'
  File "/usr/lib/python2.7/argparse.py", line 1295, in add_argument
    return self._add_action(action)
  File "/usr/lib/python2.7/argparse.py", line 1515, in _add_action
    raise ValueError(msg)
ValueError: mutually exclusive arguments must be optional

相互に排他的な議論について語っていますが、トレースバックは実際の問題とはあまり関係がないと思います。

4

3 に答える 3

1

初期設定では、--time--showはどちらもオプションの引数であり、それらをグループに入れることで、両方を同時に使用できないことをパーサーに伝えます。

を削除することで、--それらをポジショナルに変えました。デフォルトでは、定位置が必要です。両方を相互に排他的なグループに入れることは意味がありません。

オプションにすることができtimeます:

group.add_argument('time', nargs='?')

showwithstore_trueは引数を必要としないため、オプションにすることはできません。排他的なグループに属してstore_trueいない場合でも、その値は常にtrue. だから残っていなければならない--show

optional、およびオプションのグループpositional(はい、ここでは 2 つの意味で「オプション」を使用しています) が可能であり、場合によっては意味があります。

しかし、他の人が示唆しているように、代わりにサブパーサーを使用できます。

parser=argparse.ArgumentParser()
sp=parser.add_subparsers()
show=sp.add_parser('show')
show.add_argument('show',action='store_true')
time=sp.add_parser('time')
time.add_argument('time')

これshowによりNamespace(show=True)、 、およびtime 12:34:56が生成されNamespace(time='12:34:56')ます。

于 2013-07-29T06:21:53.923 に答える
1

プログラムに次の形式で引数を取らせようとしている場合

./yourprog time

また

./yourprog show

次に、subparsersを使用するか、プログラムの動作を決定する単一の「コマンド」引数をプログラムに持たせる必要があります。timeおよびshowコマンドに独自の引数を持たせたい場合は、サブパーサーが必要です。それ以外の場合は、「コマンド」引数の方が簡単です。ハイフンを削除するだけで、名前付きのオプションの引数ではなく、必須の位置引数になります。それはあなたが望むものではなく、「相互に排他的」とは互換性がありません。

于 2013-07-29T02:01:29.907 に答える