2013-04-07 7 views
5

私は、誰が誰であると言うことができないので、相互排他的なグループに複数のポジションの引数を意味をなさないことは知っています。しかし、私はそれに一つのポジションの議論を含める必要があります。私は必要なものargsの相互排他的なグループに1つの位置引数を含めるには?

位置 valueは、デフォルトのアクション( "--include" の一種)である
$ myprogram -h 
usage: myprogram [-h] [--delete value | --update value | value] 

。 (引数なしの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') 

が可能ということですか?


第二の試み:

真の値に --insertデフォルトは必要とされて
myprogram {--insert|--update|--delete} value 

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') 

答えて

8

私は少し違っこれを行うだろう:

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() 

あなたはさらに、失敗(なしvalueオプションで)program --deleteを作り、これがあることを意味することを

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

注意を追加したい場合program --insertvalueなし)は依然として動作します。 args.mode is not Noneで上記のチェックを行い、次にif args.mode is None: args.mode = 'insert'などを実行して、デフォルトのmodeNoneにすることで、これを回避できます。

+0

+1良いアプローチ – msw

3

あなたの構文はより明確と記載されています。

​​あなたがご希望の構文のように感じることができます

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 

より明確。

+0

おかげで、私は完全にあなたを理解していない:私は追加しませんでした " --insert '引数を指定し、デフォルトをTrueにします。だから、この部分はうまくいった。しかし、引数なしで 'myprogram'を呼び出すことは、' value'が必要であるため失敗します。たぶん私はあなたを全く理解していませんでした... – borges

+0

あなたの質問を新しいコードで更新するか、私が見えないものを読むことができないので新しい質問を開きます。私はあなたが必要でないmutually_exclusive_groupを維持しようとしたと思います。 – msw

+0

私は質問を更新しました。 – borges

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] 
関連する問題