我有一个可选参数,它支持参数列表本身。Python argparse:有没有一种方法可以用nargs指定一个范围?
我的意思是,它应该支持:
- -f 1 2
- -f 1 2 3
但不是:
- -f 1
- -f 1 2 3 4
有没有办法在argparse内强制这个?现在我使用nargs =“*”,然后检查列表长度。
编辑:根据要求,我所需要的是能够定义一个可接受数量的参数的范围。我的意思是,说(在本例中)2个或3个参数表是正确的,但不是1或4或任何非范围内2..3
我有一个可选参数,它支持参数列表本身。Python argparse:有没有一种方法可以用nargs指定一个范围?
我的意思是,它应该支持:
但不是:
有没有办法在argparse内强制这个?现在我使用nargs =“*”,然后检查列表长度。
编辑:根据要求,我所需要的是能够定义一个可接受数量的参数的范围。我的意思是,说(在本例中)2个或3个参数表是正确的,但不是1或4或任何非范围内2..3
你可以用custom action做到这一点:
import argparse
def required_length(nmin,nmax):
class RequiredLength(argparse.Action):
def __call__(self, parser, args, values, option_string=None):
if not nmin<=len(values)<=nmax:
msg='argument "{f}" requires between {nmin} and {nmax} arguments'.format(
f=self.dest,nmin=nmin,nmax=nmax)
raise argparse.ArgumentTypeError(msg)
setattr(args, self.dest, values)
return RequiredLength
parser=argparse.ArgumentParser(prog='PROG')
parser.add_argument('-f', nargs='+', action=required_length(2,3))
args=parser.parse_args('-f 1 2 3'.split())
print(args.f)
# ['1', '2', '3']
try:
args=parser.parse_args('-f 1 2 3 4'.split())
print(args)
except argparse.ArgumentTypeError as err:
print(err)
# argument "f" requires between 2 and 3 arguments
时间旅行者在这里。很好的答案!然而,你在这里继承了'argparse.Action' ......如果我想让我的行为成为'append',会发生什么?我怎样才能修改这段代码,以便我可以追加这个参数的多个实例,并获得指定的范围效果? – 2rs2ts 2013-07-08 22:35:20
啊,其实,你的代码与[这个答案](http://stackoverflow.com/a/5374229/691859)合并做了我一直在寻找。别介意我 - 除非你在想同样的事情,在这种情况下,请检查答案。 – 2rs2ts 2013-07-08 23:52:19
有一个建议的补丁http://bugs.python.org/issue11354添加一个范围'nargs'选项,例如'nargs =(2,3)'或'nargs ='{2,3}''('re' style notation)。当其他定位变量具有“nargs”值时,这种方法更加强大。否则,这种自定义操作方法很好。 – hpaulj 2013-07-31 20:53:12
我不明白。你的意思是你希望能够支持例如介于一到十个参数之间? – katrielalex 2010-11-16 14:08:13
请您详细说明规则是什么?你想要求至少2个,最多3个值?他们必须是1-4还是可以做任何事情? – slf 2010-11-16 14:09:35