2017-04-22 41 views
0

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

例如,我想有一个像 foo apple foo banana foo carrot

命令我在哪里可以只需指定foo ap使用foo apple子分析器。

如果我添加使用记录的方案,这些subparsers,这是行不通的,即

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

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

+0

可以嵌套子分析器。你可以有一个'foo'分解器,它内部有'苹果,香蕉和胡萝卜'分解器。 – hpaulj

回答

2

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

子分析器名称是用不同的机制处理的。对于主分析器,add_subparsers(...)创建一个位置操作,并带有choices参数。

你subparsers命令大致等效于:

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

就这么action子类,产生独特的子分析器的行为。

与常规choices,测试

astring in choices 

要求完全匹配,没有任何特殊的缩写移交。

add_parser中的“别名”参数可用于近似缩写。从文档:

此外,add_parser支持额外的别名参数,它允许多个字符串引用相同的子分析器。此示例与svn一样,别名可用作结账的简写:

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

http://bugs.python.org/issue12713

我[hpaulj]建议您关闭这个问题,取决于别名subparsers缩写。与“选择”的交互过于复杂,无法像这里提出的那样处理。

+0

这适用于Python 3.2+,但不幸的是不适用于2.7.5。根据答案中给出的解释和代码演练,2.7.5中没有办法做到这一点。 – Wade

+0

看起来像'aliases'是在2010年通过http://bugs.python.org/issue9234引入的,在修补2时。7和3+没有很好的协调。如果可能,当前系统会尝试将补丁应用于两个版本。我怀疑当前的3. +'add_parser'方法可能被猴子修补到一个2.7文件中(或者可能是整个'_SubParsersAction'子类。我不认为这个修改使用了任何特殊的3.5特性。 – hpaulj