python - nargs ='+' 的 argparse 元变量获取帮助信息中的编号参数?

标签 python argparse

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

最佳答案

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


有了positional,错误堆栈包括:

/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 

positional 没有 option_strings(或者它是空的),所以它使用 metavar, = ... 解包成语只要求一根绳子。因此出现错误:ValueError:要解压的值太多(预期为 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 .看起来用法、帮助热线和错误消息可能存在问题。


实际上问题不在于用法,而在于格式化帮助行:

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

关于python - nargs ='+' 的 argparse 元变量获取帮助信息中的编号参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48429221/

相关文章:

python - 在 OS X 10.5 上的 Python 2.6 上安装 PyObjC?

python - 在 python 中的对列表中找到最小 x 和 y 值的最佳方法?

python - 我无法在 AppEngine 开发服务器上本地使用 OpenID 单点登录来测试 Google 应用程序

Python argparse : Is there a way to specify a range in nargs?

python - 如何argparse 1-3指定的范围并返回一个列表

Python - os.access 和 os.path.exists 之间的区别?

python - 如何在 Python 中使用 argparse.ArgumentParser 从命令行传递和解析字符串列表?

python - argparse 位置中的可选参数

Python Argparse 追加 nargs= >1

python - matlab 到 python : get matlab cell array values