Skip to main content
 首页 » 编程设计

python之argparse 选项 arg 在子解析器中的位置 arg 之前使用 nargs =''

2025年05月04日10虾米姐

import argparse 
 
parser = argparse.ArgumentParser() 
parser.add_argument( 
    '--optional', 
    default=None, 
    const='some-const', 
    nargs='?', 
    help='optional') 
 
subparsers = parser.add_subparsers() 
 
subparser = subparsers.add_parser('subparser') 
 
subparser.add_argument( 
    'positional', 
    help='positional') 
 
args = parser.parse_args() 
 
print args 
 
./test.py --optional opt subparser positional 
Namespace(optional='opt', positional='positional')  <-- works as expected 
 
./test.py --optional subparser positional 
usage: test.py [-h] [--optional [OPTIONAL]] {subparser} ... 
test.py: error: invalid choice: 'positional' (choose from 'subparser')  <-- throws an error 
 Namespace(optional='some-const', positional='positional')  <-- would expect to see this 

上面是我最简单的测试代码来演示这个问题。我想有一个可选的 arg 使用 nargs='?'和 const before 我在子解析器中的位置 arg。我读过我可以将原始解析器作为父解析器传递给子子解析器,但这并不能解决问题。当我尝试这样做时,我尝试将 add_help=False 和 conflict_handler='resolve' 添加到初始解析器声明中。谁能指出我正确的方向?

谢谢, 斯科特

请您参考如下方法:

当解析 ./test.py --optional foo bar 时,argparse 看到一个可选字符串(以 -- 开头)后跟两个参数字符串(没有 --)

所以它从处理--optional开始。它的 nargs 是一个“贪婪的?”,所以它使用 foo 参数,产生:

Namespace('optional'='foo') 

这使得 bar 可以作为子命令参数使用。

它不检查 foo 是否是一个有效的子命令参数。

同样的推理适用于 ./test.py --optional subparser positional。