具有附加值的 Argparse 参数
Argparse argument with an additional value
我创建了一个 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'
我怎样才能实现这个(或一些类似的行为)?
如果设置了 ch4
参数,您可以通过 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"
$
add_argument
方法采用 type
关键字参数。任何可调用对象都可以作为此参数的参数传递。
这里有一个 class 可以传递给 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.param
是 Arg
的实例。 args.param.value
是 str
或 list
如果选择是 ch4='some_value'
我创建了一个 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'
我怎样才能实现这个(或一些类似的行为)?
如果设置了 ch4
参数,您可以通过 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"
$
add_argument
方法采用 type
关键字参数。任何可调用对象都可以作为此参数的参数传递。
这里有一个 class 可以传递给 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.param
是 Arg
的实例。 args.param.value
是 str
或 list
如果选择是 ch4='some_value'