我有一个可选参数,它支持一个参数列表本身。
我的意思是,它应该支持:
但不是:
有没有办法在argparse中强制执行此操作?现在我使用nargs =“*”,然后检查列表长度。
编辑:根据要求,我需要的是能够定义一系列可接受数量的参数。我的意思是,说(在例子中)2或3个args是正确的,但不是1或4或任何不在范围内的东西2..3
答案 0 :(得分:24)
您可以使用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