首页 > 解决方案 > 将 argparse 别名解析回原始命令

问题描述

我正在使用具有别名的子解析器/子命令

我正在使用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')

标签: pythonargparse

解决方案


有一个 Python 错误/问题要求这样做 - 保存“基本”名称,而不是别名。你不能在不改变argparse.py代码的情况下改变它。我认为更改将仅限于Action处理子解析器的子类。 https://bugs.python.org/issue36664

但我指出有更简单的方法来处理这个问题。只需按照https://docs.python.org/3/library/argparse.html#sub-commands部分set_defaults末尾附近的说明使用。那里

parser_foo.set_defaults(func=foo)

用于设置子解析器特定的功能,但它也可以用于设置“基本”名称。

parser_foo.set_defaults(name='theIncrediblyLongAlias')

推荐阅读