nargs 输入的 argparse 类型验证

argparse type validation for nargs input

我正在使用 python 3.74,我正在尝试使用 argparse 模块将一对数字读入变量 nums。我想检查两个数字之间是否满足某些条件,然后对它们进行排序。

我有下面的代码。

import argparse

def f(x):
   assert x[0]!=x[1],"err"
   return sorted([int(y) for y in x])

parser = argparse.ArgumentParser()
parser.add_argument("--nums", required=True, type=f,nargs=2)
args = parser.parse_args()  

当输入为 2 1 时,我希望上面的代码片段 return [1, 2]。我得到的是 IndexError。

这促使我使用以下代码进行调查:

parser = argparse.ArgumentParser()
parser.add_argument("--nums", required=True, type=lambda x:x*2 ,nargs=2)
args = parser.parse_args()

现在 2 1 的输出是 ['22', '11'] 这使我相信类型分别应用于每个值。有没有办法对 --nums 作为一个整体进行类型验证?我最好在 add_argument.

内完成

documentation所述

type= can take any callable that takes a single string argument and returns the converted value

我们可以通过查看 ArgParse implementationnargs 参数来确认这一点。所以你的 f 函数被每个参数调用。

如果您真的希望它作为类型检查的一部分完成,您可以要求输入 1,2 的字符串并像这样自己解析它:

def f(x):
    x = x.split(',')
    assert x[0]!=x[1],'err'
    return sorted([int(y) for y in x])

其中 1,2 的输入导致 [1, 2]

但这违背了 argparse 的目的,所以你最好在参数被解析后简单地调用你的验证器,最终用户的体验没有什么不同。

parser.add_argument("--nums", required=True, type=int, nargs=2)
args = parser.parse_args()
print(f(args.nums))

2 1returns[1, 2]

的输入