我用的是subparser/subcommand that has an alias。你知道吗
我正在使用子parser的dest
选项来存储子命令的名称,以便稍后获得它。你知道吗
当前,如果子命令的名称是reallyLongName
,别名是r
(比方说),那么dest
选项会存储reallyLongName
或r
,我输入的内容都会被存储。这很烦人,因为我现在必须检查命令名或它的任何别名,以便识别命令。你知道吗
有没有办法让argparse将子命令的名称存储在dest
字段中的某种单一规范文本字符串中?你知道吗
例如,给定以下代码:
import argparse
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest='command', help='sub-command help')
parser_ag = subparsers.add_parser( 'mySubcommand',
aliases=['m'],
help='Subcommand help')
print(parser.parse_args('mySubcommand'.split()))
print(parser.parse_args('m'.split()))
产生以下输出:
Namespace(command='mySubcommand')
Namespace(command='m')
期望的结果:command
对这两个都有一个单一的规范值,例如:
Namespace(command='mySubcommand')
Namespace(command='mySubcommand')
这是出人意料的难以挖掘。添加子parser时,它将存储在parents
._actions
属性中。从那里它只是通过挖掘属性来得到你需要的。下面,我创建字典,通过dest名称引用子parser参数,然后添加一个函数,让我们将输入的参数重新映射到主参数名称。你知道吗使用您的示例,我们可以使用以下方法重新映射解析参数:
这是一个例子,它在工作中与多个子帕瑟水平。。我们有一个带有可选参数和子参数的解析器。subparser有3个可能的参数,最后一个参数调用另一个subparser(sub subparser),其中有2个可能的参数。你知道吗
您可以检查顶级解析器或第一级子解析器来查看别名映射。你知道吗
通过使用上面的函数,我们可以将收集到的参数重新映射到它们较长的名称。你知道吗
有一个Python错误/问题要求这样做-保存“base”名称,而不是别名。如果不更改
argparse.py
代码,就无法更改它。我认为这个变化将局限于处理子parser的Action
子类。https://bugs.python.org/issue36664但我指出有一种更简单的方法来处理这个问题。只需使用
set_defaults
,如https://docs.python.org/3/library/argparse.html#sub-commands部分末尾所述。在那里用于设置特定于子Parser的函数,但也可以用于设置“base”名称。你知道吗
相关问题 更多 >
编程相关推荐