Skip to main content
 首页 » 编程设计

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

2025年05月04日16leader

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

例如:

$ 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)。