python argparse 帮助信息,如何禁用短选项的 metavar?
我想要创建一个 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
我只是想知道怎么去掉短选项和长选项之间的内容。
3 个回答
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)
8
正如被采纳的答案中的评论所提到的,下面这个参数对我来说就足够了。
metavar='\b'
8
在argparse的print_help()中不要重复显示长选项
这个问题基本上问的是同样的事情。如果你不想自己写一个HelpFormatter的子类(其实只需要改动一个方法),那么你就得使用现有的格式化工具,比如help、metavar和description。
以及 如何避免在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)