2010-11-16 74 views
22

我有一个可选参数,它支持参数列表本身。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

+0

我不明白。你的意思是你希望能够支持例如介于一到十个参数之间? – katrielalex 2010-11-16 14:08:13

+5

请您详细说明规则是什么?你想要求至少2个,最多3个值?他们必须是1-4还是可以做任何事情? – slf 2010-11-16 14:09:35

回答

15

你可以用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 
+1

时间旅行者在这里。很好的答案!然而,你在这里继承了'argparse.Action' ......如果我想让我的行为成为'append',会发生什么?我怎样才能修改这段代码,以便我可以追加这个参数的多个实例,并获得指定的范围效果? – 2rs2ts 2013-07-08 22:35:20

+1

啊,其实,你的代码与[这个答案](http://stackoverflow.com/a/5374229/691859)合并做了我一直在寻找。别介意我 - 除非你在想同样的事情,在这种情况下,请检查答案。 – 2rs2ts 2013-07-08 23:52:19

+2

有一个建议的补丁http://bugs.python.org/issue11354添加一个范围'nargs'选项,例如'nargs =(2,3)'或'nargs ='{2,3}''('re' style notation)。当其他定位变量具有“nargs”值时,这种方法更加强大。否则,这种自定义操作方法很好。 – hpaulj 2013-07-31 20:53:12

相关问题