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.
内完成
type=
can take any callable that takes a single string argument and returns the converted value
我们可以通过查看 ArgParse implementation、nargs
参数来确认这一点。所以你的 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 1
returns[1, 2]
的输入
我正在使用 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.
type=
can take any callable that takes a single string argument and returns the converted value
我们可以通过查看 ArgParse implementation、nargs
参数来确认这一点。所以你的 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 1
returns[1, 2]