多值参数的自定义使用消息

Posted

技术标签:

【中文标题】多值参数的自定义使用消息【英文标题】:Custom usage message for many-valued argument 【发布时间】:2019-05-15 01:08:59 【问题描述】:

鉴于某事。喜欢(或类似):

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("FILES", nargs="+", type=str)
args = parser.parse_args()

现在我想让多值位置参数FILES 在使用消息中显示为

usage: cli.py [-h] FILES

而不是

usage: cli.py [-h] FILES [FILES ...]

感谢任何分步说明或指示。

【问题讨论】:

投了赞成票,因为我不知道该怎么做,但我的意见是默认使用信息更清晰更好。 @Rocky Li:我不同意你的评估......但我知道这是可以做到的——虽然我自己无法弄清楚“如何”。跨度> 【参考方案1】:

这是默认格式化程序的内置行为:source。

您可以让您的 自定义格式化程序nargs="+" 类型参数进行特殊处理:

import argparse


class CustomFormatter(argparse.HelpFormatter):
    def _format_args(self, action, default_metavar):
        get_metavar = self._metavar_formatter(action, default_metavar)
        if action.nargs == argparse.ONE_OR_MORE:
            return '%s' % get_metavar(1)
        else:
            return super(CustomFormatter, self)._format_args(action, default_metavar)


parser = argparse.ArgumentParser(formatter_class=CustomFormatter)
parser.add_argument("FILES", nargs="+", type=str)
args = parser.parse_args()

会打印出来:

usage: cli.py [-h] FILES
cli.py: error: the following arguments are required: FILES

【讨论】:

【参考方案2】:

fbahr,我刚决定深入了解source code of argparse。我发现用法的格式是硬编码的,look at it here。您可以覆盖它的唯一方法是从 HelpFormatter 继承(创建新 ArgumentParser 实例时使用的默认类)并告诉解析器使用您创建的类,以 使用您自己的格式化程序。您将不得不覆盖一个名为 _format_args 的“私有”方法(前缀为下划线),这有点丑陋和反模式(实际上是唯一的原因你可以这样做是因为我们使用的是 Python),但它似乎是按照你想要的方式自定义 argparse 的唯一方法。

import argparse

class NArgsCustomUsageHelpFormatter(argparse.HelpFormatter):

    def _format_args(self, action, default_metavar):
        get_metavar = self._metavar_formatter(action, default_metavar)

        if action.nargs == argparse.ONE_OR_MORE:
            result = '%s' % get_metavar(1)
        else:
            result = argparse.HelpFormatter._format_args(self, action, default_metavar)

        return result

parser = argparse.ArgumentParser(formatter_class=NArgsCustomUsageHelpFormatter)

parser.add_argument("FILES", nargs="+", type=str)
args = parser.parse_args()

如果要格式化的操作需要至少一个参数 (nargs='+'),上面的代码只是更改默认行为,否则它不会做任何不同的事情。

希望对你有帮助!

【讨论】:

修改“私有”方法是所有其他HelpFormatter 子类的工作方式。在创建子类时,您承担了开发人员的角色,拥有所有特权和责任(至少在您自己的编程领域内)。

以上是关于多值参数的自定义使用消息的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数传递给 JHipster 中的自定义错误消息?

MFC的自定义消息的定义与使用

如何让我的自定义不和谐机器人发送消息

自动消失的自定义消息框

@Security 注释的自定义消息

用于问题跟踪的 Github Slack 集成的自定义消息