Python argparse:有没有办法在nargs中指定范围?

Dop*_*ger 31 python argparse

我有一个可选参数,支持一个参数列表本身.

我的意思是,它应该支持:

  • -f 1 2
  • -f 1 2 3

但不是:

  • -f 1
  • -f 1 2 3 4

有没有办法在argparse中强制执行此操作?现在我使用nargs ="*",然后检查列表长度.

编辑:根据要求,我需要的是能够定义一系列可接受的参数.我的意思是,说(在例子中)2或3个args是正确的,但不是1或4或任何不在2..3范围内的东西

unu*_*tbu 25

您可以使用自定义操作执行此操作:

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
Run Code Online (Sandbox Code Playgroud)

  • 这是2018年,它还在进行补丁审查. (5认同)
  • 现在到了 2020 年,它被关闭了,因为没有足够的人想要它。 (5认同)
  • 有一个建议的补丁http://bugs.python.org/issue11354添加一个范围`nargs`选项,例如`nargs =(2,3)`或`nargs ='{2,3}'``` `样式表示法).当其他位置具有可变的"nargs"值时,这种方法更强大.否则这个自定义操作方法工作正常. (3认同)
  • 时间旅行者来到这里。很好的答案!但是,您在这里对“argparse.Action”进行子类化...如果我希望我的操作是“append”,会发生什么?如何修改此代码,以便可以附加此参数的多个实例,并获得指定的范围效果? (2认同)