作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个相当大的程序,它有一个基于 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/
我是一名优秀的程序员,十分优秀!