多值参数的自定义使用消息
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
子类的工作方式。在创建子类时,您承担了开发人员的角色,拥有所有特权和责任(至少在您自己的编程领域内)。以上是关于多值参数的自定义使用消息的主要内容,如果未能解决你的问题,请参考以下文章