带有附加值的Argparse参数

时间:2016-03-24 14:45:42

标签: python argparse

我创建了一个argparse参数,它只支持3种选择:

parser.add_argument('--param', default='ch1', choices=('ch1', 'ch2', 'ch3'), help='message')

但我必须添加一个新的特殊选择ch4,这将需要一个额外的值。 即,我的程序应该支持这样的输入:

./prog.py --param ch1
./prog.py --param ch2 # or ch3
./prog.py --param ch4='some_additional_variable'

我如何实现这一点(或类似行为)?

2 个答案:

答案 0 :(得分:2)

如果ch4 param已设置,您可以通过 requiring an additional argument解决此问题

import argparse

parser = argparse.ArgumentParser(description='...')
parser.add_argument('--param', default='ch1', choices=('ch1', 'ch2', 'ch3', 'ch4'))
parser.add_argument('--setting', help="Required if param is set to ch4")

args = parser.parse_args()    
if args.param == "ch4" and not args.setting:
    parser.error("--setting is required if param is ch4")

用法:

$ python test.py --param ch1
$ python test.py --param ch2
$ python test.py --param ch3
$ python test.py --param ch4
usage: test.py [-h] [--param {ch1,ch2,ch3,ch4}] [--setting SETTING]
test.py: error: --setting is required if param is ch
$ python test.py --param ch4 --setting "some_value"
$

答案 1 :(得分:1)

add_argument方法需要type个关键字参数。任何可调用的都可以作为此参数的参数传递 这里是一个可以传递给add_argument方法的类,这可能满足您的要求。

import argparse

class Arg(object):
    def __init__(self, value):
        self.value = value
        if '=' in value:
            self.value = value.split('=', 1)

    def __str__(self):
        return '{}=<{}>'.format(self.value[0], self.value[1]) if isinstance(self.value, list) else self.value

    def __repr__(self):
        if isinstance(self.value, list):
            return repr('{}=<value>'.format(self.value[0]))
        return '{}'.format(repr(self.value))

    def __eq__(self, value):
        return '{}'.format(repr(value)) == repr(self)

parser = argparse.ArgumentParser()
parser.add_argument('--param', default='ch1', choices=('ch1', 'ch2', 'ch3', 'ch4=<value>'), type=Arg)

args = parser.parse_args('--param ch4=123'.split())
print('choice {}, value {}'.format(args.param, repr(args.param.value)))

args = parser.parse_args([])
print('choice {}, value {}'.format(args.param, repr(args.param.value)))

args = parser.parse_args('--param ch3'.split())
print('choice {}, value {}'.format(args.param, repr(args.param.value)))

输出;

choice ch4=<123>, value ['ch4', '123']
choice ch1, value 'ch1'
choice ch3, value 'ch3'

args.paramArg的一个实例。如果选择args.param.value,则strlistch4='some_value'