检查某些参数并将值赋给任意变量

时间:2016-04-29 16:53:45

标签: python argparse

我正在编写一个程序,需要查找命令行中设置的两个参数之一,并根据设置的值将值保存到单个变量中。

如果我这样打电话给程序:

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对我来说是非常新的。感谢。

2 个答案:

答案 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.actiona 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不能省略,并且两者都不能同时指定。