nargs='+' 的 argparse 元变量以获取帮助信息中的编号参数?
argparse metavar for nargs='+' to get numbered arguments in help info?
在argparse document中有一个使用nargs='+'
的例子:
parser.add_argument('integers', metavar='N', type=int, nargs='+')
对应的帮助信息为
usage: prog.py [-h] [--sum] N [N ...]
是否可以设置 metavar
使帮助信息看起来像这样?
usage: prog.py [-h] [--sum] N1 [N2 ...]
我会定制 HelpFormatter
并使用它。下面是一个快速破解。
from argparse import HelpFormatter, ZERO_OR_MORE, ONE_OR_MORE
class CustomHelpFormatter(HelpFormatter):
def _format_args(self, action, default_metavar):
get_metavar = self._metavar_formatter(action, default_metavar)
if action.nargs == ZERO_OR_MORE:
return '[%s1 [%s2 ...]]' % get_metavar(2)
elif action.nargs == ONE_OR_MORE:
return '%s1 [%s2 ...]' % get_metavar(2)
else:
return super()._format_args(action, default_metavar)
>>> parser = argparse.ArgumentParser(formatter_class=CustomHelpFormatter)
>>> parser.add_argument('integers', metavar='N', type=int, nargs='+')
>>> parser.parse_args(['--help'])
metavar
可以是元组,如
In [26]: parser = argparse.ArgumentParser()
In [27]: a=parser.add_argument('--integers', metavar=('N1','N2'), type=int, nargs='+');
In [28]: parser.print_help()
usage: ipython3 [-h] [--integers N1 [N2 ...]]
optional arguments:
-h, --help show this help message and exit
--integers N1 [N2 ...]
但这只适用于可选参数(带标记的参数),不适用于位置参数。我不确定为什么,尽管我之前可能已经研究过这个问题。
https://docs.python.org/3/library/argparse.html#metavar
有了位置,错误堆栈包括:
/usr/lib/python3.5/argparse.py in _format_action_invocation(self, action)
542 if not action.option_strings:
543 default = self._get_default_metavar_for_positional(action)
--> 544 metavar, = self._metavar_formatter(action, default)(1)
545 return metavar
546
A positional
没有 option_strings
(或者它是空的),所以它使用 metavar, = ...
解包习惯用法来只请求一个字符串。因此出现错误:ValueError: too many values to unpack (expected 1)
.
所以只期望一个 metavar
变量是有意为之,但我不确定是否合理。可能是因为在 usage
:
中很难分辨一个位置的结束位置和下一个位置的开始位置
In [34]: parser = argparse.ArgumentParser()
In [35]: parser.add_argument('foo', type=int, nargs=2);
In [36]: parser.add_argument('bar', type=int, nargs='+');
In [38]: parser.print_usage()
usage: ipython3 [-h] foo foo bar [bar ...]
几年前我看过这个,https://bugs.python.org/issue14074。看起来 usage
、帮助热线和错误消息可能存在问题。
实际上问题不在 usage
,而是在格式化帮助行:
In [39]: parser = argparse.ArgumentParser()
In [40]: a=parser.add_argument('integers', metavar=('N1','N2'), type=int, nargs='+')
In [41]: parser.print_usage()
usage: ipython3 [-h] N1 [N2 ...]
一个位置的正常帮助行只显示一个符号,而不是用法的N [N ...]
:
In [43]: parser.print_help()
usage: ipython3 [-h] N [N ...]
positional arguments:
N
在argparse document中有一个使用nargs='+'
的例子:
parser.add_argument('integers', metavar='N', type=int, nargs='+')
对应的帮助信息为
usage: prog.py [-h] [--sum] N [N ...]
是否可以设置 metavar
使帮助信息看起来像这样?
usage: prog.py [-h] [--sum] N1 [N2 ...]
我会定制 HelpFormatter
并使用它。下面是一个快速破解。
from argparse import HelpFormatter, ZERO_OR_MORE, ONE_OR_MORE
class CustomHelpFormatter(HelpFormatter):
def _format_args(self, action, default_metavar):
get_metavar = self._metavar_formatter(action, default_metavar)
if action.nargs == ZERO_OR_MORE:
return '[%s1 [%s2 ...]]' % get_metavar(2)
elif action.nargs == ONE_OR_MORE:
return '%s1 [%s2 ...]' % get_metavar(2)
else:
return super()._format_args(action, default_metavar)
>>> parser = argparse.ArgumentParser(formatter_class=CustomHelpFormatter)
>>> parser.add_argument('integers', metavar='N', type=int, nargs='+')
>>> parser.parse_args(['--help'])
metavar
可以是元组,如
In [26]: parser = argparse.ArgumentParser()
In [27]: a=parser.add_argument('--integers', metavar=('N1','N2'), type=int, nargs='+');
In [28]: parser.print_help()
usage: ipython3 [-h] [--integers N1 [N2 ...]]
optional arguments:
-h, --help show this help message and exit
--integers N1 [N2 ...]
但这只适用于可选参数(带标记的参数),不适用于位置参数。我不确定为什么,尽管我之前可能已经研究过这个问题。
https://docs.python.org/3/library/argparse.html#metavar
有了位置,错误堆栈包括:
/usr/lib/python3.5/argparse.py in _format_action_invocation(self, action)
542 if not action.option_strings:
543 default = self._get_default_metavar_for_positional(action)
--> 544 metavar, = self._metavar_formatter(action, default)(1)
545 return metavar
546
A positional
没有 option_strings
(或者它是空的),所以它使用 metavar, = ...
解包习惯用法来只请求一个字符串。因此出现错误:ValueError: too many values to unpack (expected 1)
.
所以只期望一个 metavar
变量是有意为之,但我不确定是否合理。可能是因为在 usage
:
In [34]: parser = argparse.ArgumentParser()
In [35]: parser.add_argument('foo', type=int, nargs=2);
In [36]: parser.add_argument('bar', type=int, nargs='+');
In [38]: parser.print_usage()
usage: ipython3 [-h] foo foo bar [bar ...]
几年前我看过这个,https://bugs.python.org/issue14074。看起来 usage
、帮助热线和错误消息可能存在问题。
实际上问题不在 usage
,而是在格式化帮助行:
In [39]: parser = argparse.ArgumentParser()
In [40]: a=parser.add_argument('integers', metavar=('N1','N2'), type=int, nargs='+')
In [41]: parser.print_usage()
usage: ipython3 [-h] N1 [N2 ...]
一个位置的正常帮助行只显示一个符号,而不是用法的N [N ...]
:
In [43]: parser.print_help()
usage: ipython3 [-h] N [N ...]
positional arguments:
N