2016-04-29 11 views
0

私はプログラムを作成しているので、コマンドラインで設定された2つの引数のうちの1つを探し、どちらが設定されているかに基づいて1つの変数に値を保存する必要があります。特定の引数をチェックして任意の変数に値を代入する

私はこのようなプログラムを呼び出す場合:私は'a value'に変数actionセットをしたい

myprogram -a --foo 123 

。このようにそれを呼び出します。

myprogram -b --foo 123 

そしてaction'another value'に設定する必要があります。

myprogram -c --foo 123 

これは、使用情報とともに終了する必要があります。

もちろん、私は事実の後にいくつかのif文でこれを行うことができます。

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument('-a', action='count') 
parser.add_argument('-b', action='count') 
parser.add_argument('--foo') 
.... 
args = parser.parse_args() 
if args.a == 0 and args.b == 0: 
    parser.print_usage() 
    sys.exit(1) 
if args.a > 0: 
    action = 'a value' 
elif args.b > 0: 
    action = 'another value' 

しかしargparseが少ないコードで私のためにそれを行うことができれば、私は思ったんだけど。私がドキュメントで見たことから、それは不可能ですが、Pythonは非常に新しいものです。ありがとう。

+0

私はそこにif:else:文をどこかに置かなければならないと思いません。 – MCManuelLP

答えて

0

私はhapuljの答えを使用しましたが、どちらも設定されていないかどうかを確認するためにifというステートメントで終了しました。その後、私はArgumentParser.add_mutually_exclusive_group()関数を見つけ、これで完結しました。

import argparse 
parser = argparse.ArgumentParser() 
actiongroup = parser.add_mutually_exclusive_group(required=True) 
actiongroup.add_argument('-a', action='store_const', dest='action', const='a value') 
actiongroup.add_argument('-b', action='store_const', dest='action', const='another value') 
parser.add_argument('--foo') 
.... 
args = parser.parse_args() 

は今、引数-a-bを省略することができない、との両方を同時に指定することはできません。

1

action='store_const'をご覧ください。

In [240]: parser=argparse.ArgumentParser() 
In [241]: parser.add_argument('-a', dest='action', 
    action='store_const', const='a value') 
In [242]: parser.add_argument('-b', dest='action', 
    action='store_const', const='another value') 
In [243]: parser.add_argument('--foo') 

In [244]: parser.parse_args('-a --foo 123'.split()) 
Out[244]: Namespace(action='a value', foo='123') 

In [245]: parser.parse_args('-b --foo 123'.split()) 
Out[245]: Namespace(action='another value', foo='123') 

In [246]: parser.parse_args('-c --foo 123'.split()) 
usage: ipython3 [-h] [-a] [-b] [--foo FOO] 
ipython3: error: unrecognized arguments: -c 
SystemExit: 2 

のでargs.actionは、引数に応じて、a value' or b値」を持つことになります。 -a-bの両方が同じに保存されていることに注意してください。

私は-cを未定義にしました。したがって、使用で通常のundefined出口を使用します。それは洗練されるかもしれない。

このようなcを定義すると、あなた自身の出口をやらせるだろう。

In [247]: parser.add_argument('-c', dest='action', action='store_const', const='exit') 

In [248]: args=parser.parse_args('-c --foo 123'.split()) 
In [249]: if args.action=='exit':parser.print_usage() 
usage: ipython3 [-h] [-a] [-b] [--foo FOO] [-c] 

あなたの代わりにあなたの-a-bのための「数」のaction='store_true'を使用した場合、あなたがifツリーを簡素化することができます:

if args.a: 
    action = 'a value' 
elif args.b: 
    action = 'another value' 
else: 
    parser.print_usage() 
    sys.exit(1) 
+0

ありがとう、私は 'store_const'を見ましたが、' dest'パラメータを見逃していました。それを撃つだろう。 – miken32

関連する問題