我正在编写一个程序,需要查找命令行中设置的两个参数之一,并根据设置的值将值保存到单个变量中。
如果我这样打电话给程序:
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 :(得分: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
而不是'count',则可以将if
树简化为:
if args.a:
action = 'a value'
elif args.b:
action = 'another value'
else:
parser.print_usage()
sys.exit(1)
答案 1 :(得分: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
不能省略,并且两者都不能同时指定。