如何解决如何收集argparse.ArgumentParser的所有可能参数
给出一个argparse.ArgumentParser
,例如
parser.py
from argparse import ArgumentParser
p = ArgumentParser()
subs = p.add_subparsers()
a = subs.add_parser('a')
a.add_argument('aa')
b = subs.add_parser('b')
b.add_argument('bb')
p.parse_args()
现在,我可以使用 python parser.py -h / b -h / a -h 来调用它,并且每次调用都给我所有与上述相关的选项子解析器。将它们加在一起,我可以获得所有参数的完整列表。
我可以这样:
from parser import p
p.print_help()
我可以访问p._subparsers
,但这并不能给我太多帮助。
-如何正确执行此操作?
我最终想要得到的是:pytest测试,在这里我可以测试所有选项都会产生有效的响应,例如python parser a aa
实际上会执行aa
解决方法
from argparse import ArgumentParser
p = ArgumentParser()
subs = p.add_subparsers()
a = subs.add_parser('a')
aa = a.add_argument('aa')
b = subs.add_parser('b')
bb = b.add_argument('bb')
p.parse_args()
add_argument
返回一个Action
对象。在parser._actions
列表中也引用了这些对象,但是您可以自己收集引用,无论是按名称还是列表(或dict)。 add_subparsers
是add_argument
的变体,它创建了Action
的特殊子类,该子类具有add_parser
方法。
尝试在交互式会话中运行此代码,然后查看创建的对象。大多数方法具有repr
方法,该方法显示键(但不是全部)属性。对于操作,这将包括dest
,nargs
,default
等内容。您甚至可以在创建后修改这些属性。 argparse
是按照普通的Python类层次结构编写的。
关于_
和__
属性-没有记录,但这并不意味着它们会在瞬间被更改。发生变化时argparse
会在蜗牛通过时出现,并考虑到向后兼容性(尽管有时还不够)。更改文档比代码本身更容易,尤其是_actions
之类的核心内容。
但是我不确定您要做什么。用argparse
运行单元测试有点尴尬。您可以模拟args = parse.parse_args(argv)
,其中argv
是您选择的字符串列表。或者,您可以将sys.argv[1:]
设置为一组新的字符串。或者,您可以创建一个新的args=argparse.Namespace(...)
对象。仅仅根据parser
设置来尝试生成所有可能的参数组合听起来很麻烦,尤其是在使用子解析器时。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。