是否可以在ArgumentParser中运行类型后操作



一般来说,我的目标是在对参数进行净化后对其进行验证。也许我的管道是错误的,但在我看来,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做任何事情。您也可以使用普通存储,并在解析后处理这些值。在解析器中执行所有操作不会得到额外的分数。

最新更新