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

时间:2018-12-13 18:44:11

标签: python python-3.x argparse

给某事。喜欢(或类似):

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 ...]

任何分步说明或指示都值得赞赏。

2 个答案:

答案 0 :(得分:4)

这是默认格式化程序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

答案 1 :(得分:1)

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='+'),那么上面的代码只是更改了默认行为,否则它没有任何不同。

This is the output

希望对您有帮助!