我有一个像这样的程序:

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确实指出了这一点。

10-05 22:04