Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python argparse:子解析器上的前缀或智能匹配_Python_Command Line_Argparse - Fatal编程技术网

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

python argparse:子解析器上的前缀或智能匹配,python,command-line,argparse,Python,Command Line,Argparse,是否可以在python(2.7)argparse中添加子parser,在指定要执行的子命令时不需要精确匹配?有人知道怎么做吗?它已经在长选项上进行前缀匹配,例如,--my long option可以指定为--my-l,只要它是所有其他选项中唯一的前缀 例如,我想要一个命令,比如 苹果 福香蕉 富胡萝卜 在这里,我可以指定fooap来使用fooapple子parser 如果我使用文档化的方案添加这些子parser,这将不起作用,即 sub = parser.add_subparsers(hel

是否可以在python(2.7)
argparse
中添加子parser,在指定要执行的子命令时不需要精确匹配?有人知道怎么做吗?它已经在长选项上进行前缀匹配,例如,
--my long option
可以指定为
--my-l
,只要它是所有其他选项中唯一的前缀

例如,我想要一个命令,比如

苹果
福香蕉
富胡萝卜

在这里,我可以指定
fooap
来使用
fooapple
子parser

如果我使用文档化的方案添加这些子parser,这将不起作用,即

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

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

正如您所注意的,长选项与缩写一起使用。在最新版本中,您可以使用
allow_abbrev=False
参数将其关闭

子parser名称使用不同的机制处理。对于主解析器,
add_subparser(…)
使用
choices
参数创建一个位置动作

您的subparsers命令大致相当于:

sp = parser.add_argument(dest='cmd', choices={'apple','banana', 'carrot'}, action=argparse._SubParsersAction, nargs='+...')
正是
action
子类产生了独特的subparser行为

与常规的
选择一样
,测试是

astring in choices
要求精确匹配,无任何特殊缩写

add\u parser
中的“alias”参数可用于近似缩写。从文件中:

此外,add_解析器还支持一个附加的alias参数,该参数允许多个字符串引用同一个子解析器。本例与svn一样,别名co作为签出的简写:

一个允许缩写的补丁在不久前被提出。它是去年提交的,但后来因为有一些bug而撤回

我[hpaulj]建议关闭此问题,并依赖于子帕瑟缩写的别名。与“选择”的交互太复杂了,无法像这里建议的那样处理


可以嵌套次parser。您可以有一个
foo
subparser,在tern中有
apple、banana和carrot
subparser。这适用于python 3.2+,但不幸的是不适用于2.7.5。根据答案中给出的解释和代码演练,在2.7.5中没有办法做到这一点。看起来
别名是在2010年通过via引入的,当时修补2.7和3+没有很好地协调。如果可能,当前系统会尝试将修补程序应用于两个版本。我怀疑当前的3.+
add\u parser
方法可能会被修补到一个2.7文件中(或者整个
\u subparseraction
子类中)。我不认为这个更改使用了任何特殊的3.5特性。