我一直试图想出一种方法来让argparse使用嵌套的可选子分析器。
我希望看到的一个基本示例是使用“第一个”subparser,search,它会搜索我拥有的某些数据。这有一些我们可以搜索的可选项(例如,all,group,type,tags等)。示例可能看起来像
$ python test.py search --type <type> --group <group>
然后我希望可选的子分析符与这些搜索结果进行交互,例如更新或删除条目。一个例子如下:
$ python test.py search --type <type> --group <group> update --tags <new_tags>
我遇到的问题是,当我将'update'解析器作为'search'子解析器的subparser时,如果我运行第一个例子,我会得到错误:
$ python test.py search --type <type> --group <group>
test.py search: error: too few arguments
为了解决这个问题,我听说过(http://www.alanbriolat.co.uk/optional-positional-arguments-with-argparse.html),但是我无法使用 - 选项。也许我错过了那里的东西?我也在查看bug 9253(http://bugs.python.org/issue9253),特别是'git remote'部分,但我没有看到解决方案。
有关在argparse中使用此功能的任何建议吗?如果需要的话,我可以为此推出自己的争论解析器,但如果我能利用argparse会更好。
感谢。
答案 0 :(得分:1)
如果我正确地读到你,这真的不是关于嵌套的子算子,而是关于使subparsers可选。
subparser参数是一个需要选择的位置参数。实际上,这是必需的。可选项采用“必需”参数,但位置不会。
但正如Bug 9253中所讨论的,在开发版本中,subparsers已成为可选(不是必需的)。那是因为argparse如何测试缺失的参数。我提出了一个修补程序,默认情况下需要子分析程序,但也为用户提供了使其不需要的选项。 http://bugs.python.org/file29793/required.patch
不幸的是,这涉及调整argparse内部。
如何省略嵌套的子分析符并使用parse_known_args
?如果我的猜测是正确的,可选的嵌套subparser命令(及其参数)将在'rest'中返回,然后您可以使用新的解析器处理它。