python - 如何在 Python 的 argparse 中对同一组参数调用 parse_args() 两次?

标签 python argparse

简化测试用例: 我有一个带有两个参数的脚本。第一个是整数列表。第二个是必须包含在第一个参数的整数集中的单个整数。

例如:

$ python argtest.py --valid_nums 1 2 3 --num 2

应该可以,但是:

$ python argtest.py --valid_nums 1 2 3 --num 4

应该不起作用,因为 num 不是 in valid_nums。但是,我在实现此功能时遇到了一些困难(阅读:我怀疑这比它的值(value)更麻烦,但我真的希望它能工作)。

实现尝试:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--valid_nums',
                    type=int,
                    nargs='+')

args = parser.parse_args()
print "Numbers: ", args.valid_nums


parser.add_argument('--num',
                    type=int,
                    choices=args.valid_nums)

args = parser.parse_args()
print args

实际输出:

$ python argtesttest.py --valid_nums 1 2 3 --num 2
usage: argtesttest.py [-h] [--valid_nums VALID_NUMS [VALID_NUMS ...]]
argtesttest.py: error: unrecognized arguments: --num 2

期望的输出:

$ python argtesttest.py --valid_nums 1 2 3 --num 2
Namespace(num=2, valid_nums=[1, 2, 3])

现在,(我认为)这里的问题是我无法在调用 parse_args() 后向解析器添加新参数,这会产生关于无法识别参数的错误,但我可以想办法绕过它。有没有什么方法可以打断参数的处理,使其不是一次全部完成?

显然,如果我只调用一次 parse_args() 并自己处理容器成员资格检查,这将是非常微不足道的,但我希望使用 让它“本地”工作argparse 的内置错误检查。

有什么想法吗?

最佳答案

您需要使用 parser.parse_known_args() 而不是 parser.parse_args(),或者在调用 parse_args() 之前将所有参数添加到解析器

parse_args()需要理解sys.argv中的所有当前参数,在第一次时已经包含了--num解析,因此异常(exception)。

关于python - 如何在 Python 的 argparse 中对同一组参数调用 parse_args() 两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32362008/

相关文章:

python - 我的快速排序因大小为 2^13 的列表而挂起

python - 查找列表中最大的匹配项

python - 如何在散点图 matplotlib 中缩小图例元素?

python - Matplotlib 工作流程

python - 可以组合两个 Python argparse 对象吗?

Python:唯一标识模块中的函数

python - argparse 与 argument_groups 和 mutually_exclusive_group

python - argparse 接受 int 和字符串?

python - 如何让 Python Argparse 只列出一次选项?

python - 如何在 Python 3.7+ 中使用 argparse 传递日期?