Python argparse:nargs中可以指定范围吗?

39 投票
1 回答
19492 浏览
提问于 2025-04-16 07:09

我有一个可选的参数,这个参数本身可以接受一系列的参数。

也就是说,它应该支持:

  • -f 1 2
  • -f 1 2 3

但不应该支持:

  • -f 1
  • -f 1 2 3 4

有没有办法在argparse中强制实现这个功能?现在我使用的是nargs="*",然后再检查列表的长度。

编辑:根据要求,我需要的是能够定义一个可接受参数数量的范围。我的意思是,在这个例子中,2个或3个参数是正确的,但1个、4个或者任何不在2到3范围内的参数都是不对的。

1 个回答

32

你可以通过一个自定义操作来实现这个功能:

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

撰写回答