2013-07-09 18 views
0

我使用一些从this answer代码,特别是部分的,其提出了一个argparse.ArgumentTypeError获取参数,而不是dest的名称()

raise argparse.ArgumentTypeError(
       "argument '{f}' requires between {nmin} and {nmax} " 
       "arguments".format(f=self.dest, nmin=nmin, nmax=nmax)) 

不过,我也上涨在append动作行为到我的子类'__call__(),这意味着这些重复的参数中的一个或多个可能格式不正确,并可能引发ArgumentTypeError

所以,当我使用这个对于这样的参数在解析器:

parse = argparse.ArgumentParser() 
parser.add_argument("-a", "--append-arg", action=append_range(2,3), default=[]) 

我打字错误的参数个数得到一个错误,我得到的是这样的:

argparse.ArgumentTypeError: argument 'append_arg' requires between 2 and 3 arguments 

太好了,那就是我希望它被使用的方式。但是现在参数列表在命名空间中被命名为append_arg。我希望它被命名为list_of_repeated_args或其他。所以,如果我做的:

parser.add_argument("-a", "--append-arg", action=append_range(2,3), default=[], dest="list_of_repeated_args") 

然后我得到这个的错误,而不是:

argparse.ArgumentTypeError: argument 'list_of_repeated_args' requires between 2 and 3 arguments 

这不是我想要的。当然,我可以改变函数,把我想要的名字作为参数,但是我想只是自动使用这个名字。有没有办法做到这一点? (即,我应该放置什么来代替f=self.dest?)

回答

0

找出解决方案。定制argparse.Action__call__()方法具有option_string参数,而根据the docs,是:

这是用于调用该操作选项字符串。 option_string参数是可选的,如果该动作与位置参数关联,则该参数将不存在。

果然,如果我改变了下面的代码使用option_string代替

raise argparse.ArgumentTypeError(
       "argument '{f}' requires between {nmin} and {nmax} " 
       "arguments".format(f=option_string, nmin=nmin, nmax=nmax)) 

我得到(假设我使用缩写形式)的预期效果:

argparse.ArgumentTypeError: argument '-a' requires between 2 and 3 arguments