Python argparse帮助消息,如何禁用短选项的metavar?

9
我希望构建一个类似于以下样式的 argparser 帮助信息:

-i, --input=INPUT    help for input
-o, --output=output  help for output

我的当前代码:
arg_parser = argparse.ArgumentParser
arg_parser.add_argument('-i', '--input', dest='input', metavar='=INPUT', help='help for input')
arg_parser.add_argument('-o', '--output', dest='output', metavar='=OUTPUT', help='help for output')
arg_parser.print_help()

给我正在提供。
-i =INPUT, --input =INPUT    help for input
-o =INPUT, --output =output  help for output

我只想知道如何去除短选项和长选项之间的内容。

2
使用默认的帮助格式化程序无法完成此操作;您需要编写一个自定义的帮助格式化程序来实现这一点。 - chepner
3个回答

8

argparse中print_help()不要重复显示长选项

这个问题基本上是一样的。如果您不想编写自己的HelpFormatter子类(它可能需要更改一个方法),则需要使用现有的格式化工具-help、metavar和description。

还可以参考这个 argparse帮助信息中不要重复使用全大写字母

以及这个 如何避免在Python的argparse模块中使用大写占位符

针对那个88275023问题,我解决了(但没有发布)这个Formatter类。修改在最后面。

class CustomFormatter(argparse.HelpFormatter):
    def _format_action_invocation(self, action):
        if not action.option_strings:
            metavar, = self._metavar_formatter(action, action.dest)(1)
            return metavar
        else:
            parts = []
            # if the Optional doesn't take a value, format is:
            #    -s, --long
            if action.nargs == 0:
                parts.extend(action.option_strings)

            # if the Optional takes a value, format is:
            #    -s ARGS, --long ARGS
            # change to 
            #    -s, --long ARGS
            else:
                default = action.dest.upper()
                args_string = self._format_args(action, default)
                for option_string in action.option_strings:
                    #parts.append('%s %s' % (option_string, args_string))
                    parts.append('%s' % option_string)
                parts[-1] += ' %s'%args_string
            return ', '.join(parts)

7
metavar=' '表示-i, --input(不包括空格),而metavar='\b'表示-i, --input。请注意,这是对命令行参数的解释说明,没有其他内容返回。 - Zhuoer Dong

8

正如接受答案的评论中所提到的,对于我来说,以下参数已足够。

metavar='\b'

1
如果所讨论的参数选项将是 required=True,我建议使用这个 - 如果你使用 metavar='',你会得到一个 AssertionError - skwidbreth

0

更短的自定义格式化程序版本:

import argparse


class HelpFormatter(argparse.HelpFormatter):
    def _format_action_invocation(self, action: argparse.Action) -> str:
        formatted = super()._format_action_invocation(action)
        if action.option_strings and action.nargs != 0:
            formatted = formatted.replace(
                f" {self._format_args(action, self._get_default_metavar_for_optional(action))}",
                "",
                len(action.option_strings) - 1,
            )

        return formatted

示例输出:

app@01d3adfb794b:/usr/local/src/app$ app database --help
Usage: app database [-h] [-s] [-d] [-b [NAME]]

Options:
  -h, --help           Show this help message and exit
  -s, --sync           Manually sync the database with the services
  -d, --dump           Dump the database as JSON to the STDOUT
  -b, --backup [NAME]  Generate and store a database backup (default: %timestamp%.bak)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接