2016-04-29 51 views
0

我正在編寫一個程序,需要查找在命令行中設置的兩個參數之一,並根據設置的值將其保存到單個變量中。檢查某些參數並將值賦給任意變量

如果我稱這樣的程序:

myprogram -a --foo 123 

我希望變量action設置爲'a value'。這樣稱呼它:

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都存儲到相同的dest

我離開-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] 

如果使用action='store_true',而不是「計數」爲您-a-b,可以簡化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