我有一个像这样的程序:
prog.py filename -r
使用我给的默认默认值
prog.py filename -r 0 500 20
使用
0, 500 and 20
我设法做到这一点:
class RdistAction(argparse.Action):
def __call__(self,parser,namespace,values,option_string=None):
if not values:
setattr(namespace,self.dest,[0, 1000, 50])
else:
setattr(namespace,self.dest,values)
parser = argparse.ArgumentParser()
parser.add_argument("-r", "--rdist", action=RdistAction, nargs='*', type=int)
args = parser.parse_args()
但是我想变得固执,因为我最初的目标是将nargs设置为3。但是当我在上面的代码中使用nargs = 3时,我收到一条错误消息,指出需要3个参数。
我到处搜索,从结果中我的直觉告诉我,我必须添加
def __init__
并修改该函数中的某些内容。当使用nargs='*'
时,是否可以获得与上述代码相同的结果,但是使用nargs=3
代替? 最佳答案
如果我将add_argument
行更改为nargs='3'
,我想我会收到您正在考虑的错误:
Traceback (most recent call last):
File "python", line 12, in <module>
ValueError: length of metavar tuple does not match nargs
如果我设置
nargs=3
(不带引号),那么它对我有用:import argparse
class RdistAction(argparse.Action):
def __call__(self,parser,namespace,values,option_string=None):
if not values:
setattr(namespace,self.dest,[0, 1000, 50])
else:
setattr(namespace,self.dest,values)
parser = argparse.ArgumentParser()
parser.add_argument("-r", "--rdist", action=RdistAction, nargs=3, type=int)
print parser.parse_args('-r 0 500 20'.split())
给
Namespace(rdist=[0, 500, 20])
那是您要找的东西吗?
这里的窍门是,如果nargs不是特殊字符之一('?','*','+'等),则它必须是整数,而不是字符串。
注意the documentation确实指出了这一点。