一般来说,我的目标是在对参数进行净化后对其进行验证。也许我的管道是错误的,但在我看来,ArgumentParser
不允许在一瞬间完成这项工作。为了净化这个参数,我使用了一个自定义的action
,为了验证,我使用一个自定义type
。
在下面的示例中,我有以下参数:2 days ago
。我想把它作为一个单独的论点来验证。所以我做了一个自定义操作,它将[2, 'days', 'ago']
连接到一个字符串中。我很乐意在使用test_type
函数之后对其进行验证。
from argparse import ArgumentParser, Action
parser = ArgumentParser()
def test_type(value):
print (value)
return value
class ActionJoinString(Action):
def __call__(self, parser, namespace, values, option_string=None):
setattr(namespace, self.dest, ' '.join(values))
parser.add_argument('timerange', nargs='+', action=ActionJoinString, type=test_type)
options = parser.parse_args('2 days ago'.split())
print(options)
输出如下:
$ python asd.py
2
days
ago
Namespace(timerange='2 days ago')
因此,正如您所看到的,即使timerange
连接在一个字符串中,也会对值数组执行类型验证。有什么简单的方法可以按我的方式完成吗?我原以为用特殊的nargs
来连接字符串中的参数会很好,但我发现它并不存在。
谢谢你的提示!
基于nargs
,解析器为该Action分配一个字符串列表。您将在get_values
方法中看到,对于"+",字符串一次一个地传递到get_value
,在那里它们通过type
(并且可以针对choices
进行测试(。只有在这之后,它们才作为values
被传递到动作_call__
。
所以CCD_ 16只针对CCD_ 17中的一个字符串。
但你的行动号召可以用values
做任何事情。您也可以使用普通存储,并在解析后处理这些值。在解析器中执行所有操作不会得到额外的分数。