python argparse:子解析器上的前缀或智能匹配

时间:2017-04-22 22:44:33

标签: python command-line argparse

在指定要执行哪个子命令时,是否可以在python' s(2.7)argparse中添加不需要完全匹配的子分段?有谁知道如何做到这一点?它已经在长选项上进行前缀匹配,例如--my-long-option可以指定为--my-l,只要它是所有其他选项中的唯一前缀。

例如,我想要一个像这样的命令 foo apple foo banana foo carrot

我可以指定foo ap使用foo apple子分析符。

如果我使用记录的方案添加这些子分析符,则不起作用,即

sub = parser.add_subparsers(help='commands')
apple = sub.add_parser( 'apple', ... )
banana = sub.add_parser( 'banana', ... )
carrot = sub.add_parser( 'carrot', ... )

这需要指定完整的子命令名称。

1 个答案:

答案 0 :(得分:2)

您注意到长选项适用于缩写。在最近的版本中,您可以使用allow_abbrev=False参数将其关闭。

使用不同的机制处理子分析器名称。对于主解析器,add_subparsers(...)创建一个位置Action,其中包含choices参数。

您的subparsers命令大致相当于:

sp = parser.add_argument(dest='cmd', choices={'apple','banana', 'carrot'}, action=argparse._SubParsersAction, nargs='+...')

action子类产生唯一的子析符行为。

与常规choices一样,测试是

astring in choices

要求完全匹配,不需要任何特殊缩写。

add_parser中的'aliases'参数可用于近似缩写。来自文档:

  

此外,add_parser支持额外的别名参数,该参数允许多个字符串引用相同的子分析符。这个例子,就像svn一样,别名co作为结帐的简写:

前一段时间提出了允许缩写的补丁。它是去年提交的,但后来因为它有一些错误而收回。

http://bugs.python.org/issue12713

  

我[hpaulj]建议关闭此问题,并依赖别名为subparsers缩写。与“选择”的互动过于复杂,无法像这里提出的那样处理。