Python3 Argparse metavar方括号奇怪地解析

问题描述 投票:0回答:3

我正在python3中使用argparse,但得到了一些奇怪的东西:

我正在使用的简短代码版本是:

argparser = argparse.ArgumentParser(description='add/remove items')
argparser.add_argument('-a', action='append',     metavar="Item(s)", help='add one or more items to the list')
argparser.add_argument('-r', action='append',     metavar="Item(s)", help='remove one or more items from the list')
args = argparser.parse_args()

当我使用-h标志运行脚本时,得到以下输出:

usage: test.py [-h] [-a Items)] [-r Item(s]

add/remove items

optional arguments:
  -h, --help  show this help message and exit
  -a CPE(s)   add one or more items to the list
  -r CPE(s)   remove one or more items from the list

请注意第一行中括号的奇怪解析。

什么原因造成的,我该如何解决?

python-3.x formatting argparse brackets
3个回答
1
投票

由于您希望拥有多个项目。用argparse做到这一点的另一种方法如下:

import argparse
argparser = argparse.ArgumentParser(description='add/remove items')
argparser.add_argument('-a', metavar="item", nargs="*", help='add one or more items to the list')
argparser.add_argument('-r', metavar="item", nargs="*", help='remove one or more items from the list')
args = argparser.parse_args()

关键是使用nargs="*"(0个或更多参数)。帮助变为:

usage: test.py [-h] [-a [item [item ...]]] [-r [item [item ...]]]

这样,您不必使用“ Item(s)”,并且您还遵循标准做法。

PS:我明白了你想做什么。使用action="append",实际上是允许用户指定多个-a-r选项。在这种情况下,您肯定应该写"Item"(而不是“ Item(s)”),因为每个选项都包含一个项目。这也解决了您的问题(您的帮助消息应指出可以提供多个-a-r选项)。


3
投票

是元变量中的()导致用法混乱。使用格式器使用()标记要求互斥的组,然后删除多余的组。因此,它尝试保留( -o | -t),但将(-o)更改为-o。不幸的是,该代码无法区分添加的代码和通过metavar(或帮助线)添加的代码。

您的行的格式设置为:

usage: test.py [-h] [-a Item(s)] [-r Item(s)]

但是它删除了我用*:代替的()的外部对>

usage: test.py [-h] [-a Item*s)] [-r Item(s*]

http://bugs.python.org/issue11874专注于另一种使用问题,当使用行较长且需要拆分时会发生此问题。但是该问题的最后2个帖子处理了这个问题。

如果您不喜欢自动usage格式的限制,则可以给parser您自己的自定义usage参数。


0
投票

我在Python 2.7中的解决方案是重写argparse.format_usage()和argparse.format_help()。您对元变量进行编码,然后在argparse对其进行格式化后对其进行解码:

© www.soinside.com 2019 - 2024. All rights reserved.