我正在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
请注意第一行中括号的奇怪解析。
什么原因造成的,我该如何解决?
由于您希望拥有多个项目。用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
选项)。
是元变量中的()
导致用法混乱。使用格式器使用()
标记要求互斥的组,然后删除多余的组。因此,它尝试保留( -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
参数。
我在Python 2.7中的解决方案是重写argparse.format_usage()和argparse.format_help()。您对元变量进行编码,然后在argparse对其进行格式化后对其进行解码: