6

誰が誰であるかを言うことができないため、複数の位置引数を相互に排他的なグループにすることは意味がありません。しかし、その中に 1 つの位置引数を含める必要があります。

必要なもの:

$ myprogram -h
usage: myprogram [-h] [--delete value | --update value | value]

positionalvalueがデフォルトのアクションです (「--include」のようなもの)。(myprogram引数なしも有効でなければなりません)。

私の最初の試み(これは機能しません):

parser = ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument('--delete', metavar='value')
group.add_argument('--update', metavar='value')
group.add_argument('value')

それは可能ですか?


2 回目の試行:

parser = ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument('--delete', action='store_true')
group.add_argument('--update', action='store_true')
group.add_argument('--insert', action='store_true', default=True)
group.add_argument('value')
4

3 に答える 3

10

私はこれを少し違う方法で行います:

parser = ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.set_defaults(mode='insert')
group.add_argument('--delete', action='store_const', dest='mode', const='delete')
group.add_argument('--update', action='store_const', dest='mode', const='update')
group.add_argument('--insert', action='store_const', dest='mode', const='insert')
parser.add_argument('value', nargs='?')
args = parser.parse_args()

program --deleteさらに(valueオプションなしで)失敗させたい場合は、追加します

if args.mode != 'insert' and args.value:
    parser.error("can't {} without a value argument".format(args.mode))

program --insertこれは、 (なしでvalue)まだ機能することを意味することに注意してください。modeデフォルトを にNoneし、 で上記のチェックを行ってから、args.mode is not Noneまたはif args.mode is None: args.mode = 'insert'同様のことを行うことで、もう少し努力することでこれを回避できます。

于 2013-04-07T15:49:50.317 に答える
3

位置引数をオプションにする ('?' を使用)

parser = ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument('--delete', metavar='value')
group.add_argument('--update', metavar='value')
group.add_argument('value', nargs='?')

使用法は次のとおりです。

usage: ipython [-h] [--delete value | --update value | value]
于 2013-08-09T05:14:51.013 に答える
3

構文は次のように明確に記述されています。

myprogram {--insert|--update|--delete} value

ここで、--insertデフォルトは True で、値が必要です。

argparse次のような場合、目的の構文がそのモデルに適合する必要があるように感じさせることができます

if args.insert and (args.update or args.delete):
    parser.print_help()

はるかに明白です。

コメントに応じて追加:

これを実装する方法を示す疑似コード(つまり、テストしていないことを意味します)は次のとおりです。

parser.add_argument('--insert', action='store_true')
parser.add_argument('--update', action='store_true')
parser.add_argument('--delete', action='store_true')
parser.add_argument('value')
args = parser.parse_args(sys.argv)
if ((args.insert and args.delete) or
    (args.insert and args.update) or
    (args.update and args.delete)):
    # can't pick more than one, complain and quit 
elif not (args.update or args.delete):
    # they specified no action so assume insert
    args.insert = True

# now one and only one of insert/update/delete is
# True and args.value contains the argument

それが物事をより明確にすることを願っています。

于 2013-04-07T01:51:45.157 に答える