gpt4 book ai didi

python - argparse 按需导入类型、选择等

转载 作者:行者123 更新时间:2023-11-28 16:38:34 26 4
gpt4 key购买 nike

我有一个相当大的程序,它有一个基于 argparse 的 CLI 交互,有几个子解析器。 subparsers 参数的支持选项列表是根据数据库查询、解析不同的 xml 文件、进行不同的计算等来确定的,因此它是相当 IO 密集型和耗时的。

问题是 argparse 似乎在我运行脚本时为所有子解析器获取 choices,这增加了相当大且烦人的启动延迟。

有没有办法让 argparse 只获取和验证当前​​使用的子解析器的 choices

一个解决方案可能是将所有验证逻辑移到代码的更深处,但这意味着我希望尽可能避免大量工作。

谢谢

最佳答案

要延迟选择的获取,您可以分两个阶段解析命令行:在第一阶段,您只找到子解析器,在第二阶段,子解析器用于解析其余参数:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('subparser', choices=['foo','bar'])

def foo_parser():
parser = argparse.ArgumentParser()
parser.add_argument('fooval', choices='123')
return parser

def bar_parser():
parser = argparse.ArgumentParser()
parser.add_argument('barval', choices='ABC')
return parser

dispatch = {'foo':foo_parser, 'bar':bar_parser}
args, unknown = parser.parse_known_args()
args = dispatch[args.subparser]().parse_args(unknown)
print(args)

可以这样使用:

% script.py foo 2
Namespace(fooval='2')

% script.py bar A
Namespace(barval='A')

请注意,顶级帮助信息不太友好,因为它只能告诉您子解析器的选择:

% script.py -h
usage: script.py [-h] {foo,bar}
...

要在每个子解析器中查找有关选择的信息,用户必须选择子解析器并将 -h 传递给它:

% script.py bar -- -h
usage: script.py [-h] {A,B,C}

-- 之后的所有参数都被视为非选项(script.py),因此由 bar_parser 解析。

关于python - argparse 按需导入类型、选择等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22742450/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com