Python argparse 带有标志的选择参数的正确格式
Python argparse proper formatting of choice arguments with flag
我正在尝试使用 Python 的 argparse 为 'choice' 类型的命令行参数创建格式良好的帮助消息。对于命令,我允许使用名称“--operation”和别名“-o”。目前,argparse 正在打印帮助消息中两者旁边的选项列表。
请注意,这个问题不同于格式化帮助消息 选项 的问题(Anthon 在这里对这个问题有很好的回答:Python argparse: How to insert newline in the help text?)
>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-o', '--operation', help="operation to perform", type=str, choices=["create", "update", "delete"])
_StoreAction(option_strings=['-o', '--operation'], dest='operation', nargs=None, const=None, default=None, type=<class 'str'>, choices=['create', 'update', 'delete'], help='operation to perform', metavar=None)
>>> parser.print_help()
usage: [-h] [-o {create,update,delete}]
optional arguments:
-h, --help show this help message and exit
-o {create,update,delete}, --operation {create,update,delete}
operation to perform
>>>
我的问题是这一行:
-o {create,update,delete}, --operation {create,update,delete}
选项列表重复两次的方式非常笨拙。特别是因为我会有更长的列表。我认为有这个会更好:
-o, --operation {create,update,delete}
这当然假设没有关于它如何工作的一些 POSIX 规则。我觉得没有。
我怎样才能达到预期的输出?还是有充分的理由我不应该尝试?
这是一个很好的 hack,但似乎没有一个很好的地方可以挂钩。
定义您自己的格式化程序,它会覆盖(通过基本复制)_format_action_invocation
方法。您要做的唯一更改是仅将选项添加到 last 选项字符串。
class MyHelpFormatter(HelpFormatter):
def _format_action_invocation(self, action):
if not action.option_strings:
default = self._get_default_metavar_for_positional(action)
metavar, = self._metavar_formatter(action, default)(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
else:
default = self._get_default_metavar_for_optional(action)
args_string = self._format_args(action, default)
for option_string in action.option_strings[:-1]:
parts.append('%s' % (option_string,))
parts.append('%s %s' % (action.option_strings[-1], args_string)
return ', '.join(parts)
我正在尝试使用 Python 的 argparse 为 'choice' 类型的命令行参数创建格式良好的帮助消息。对于命令,我允许使用名称“--operation”和别名“-o”。目前,argparse 正在打印帮助消息中两者旁边的选项列表。
请注意,这个问题不同于格式化帮助消息 选项 的问题(Anthon 在这里对这个问题有很好的回答:Python argparse: How to insert newline in the help text?)
>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-o', '--operation', help="operation to perform", type=str, choices=["create", "update", "delete"])
_StoreAction(option_strings=['-o', '--operation'], dest='operation', nargs=None, const=None, default=None, type=<class 'str'>, choices=['create', 'update', 'delete'], help='operation to perform', metavar=None)
>>> parser.print_help()
usage: [-h] [-o {create,update,delete}]
optional arguments:
-h, --help show this help message and exit
-o {create,update,delete}, --operation {create,update,delete}
operation to perform
>>>
我的问题是这一行:
-o {create,update,delete}, --operation {create,update,delete}
选项列表重复两次的方式非常笨拙。特别是因为我会有更长的列表。我认为有这个会更好:
-o, --operation {create,update,delete}
这当然假设没有关于它如何工作的一些 POSIX 规则。我觉得没有。
我怎样才能达到预期的输出?还是有充分的理由我不应该尝试?
这是一个很好的 hack,但似乎没有一个很好的地方可以挂钩。
定义您自己的格式化程序,它会覆盖(通过基本复制)_format_action_invocation
方法。您要做的唯一更改是仅将选项添加到 last 选项字符串。
class MyHelpFormatter(HelpFormatter):
def _format_action_invocation(self, action):
if not action.option_strings:
default = self._get_default_metavar_for_positional(action)
metavar, = self._metavar_formatter(action, default)(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
else:
default = self._get_default_metavar_for_optional(action)
args_string = self._format_args(action, default)
for option_string in action.option_strings[:-1]:
parts.append('%s' % (option_string,))
parts.append('%s %s' % (action.option_strings[-1], args_string)
return ', '.join(parts)