仅在参数列表中更改argparse中的metavar值,而不是在其用法

时间:2015-06-08 08:43:28

标签: python command-line-arguments argparse

我的问题类似于argparse help without duplicate ALLCAPS问题。

虽然我会简要解释一下这个问题是什么,我的问题是什么:
我希望以与默认-h,--help相同的方式显示我的选项的argparse帮助,在每个选项后没有ALLCAPS文本,或者至少没有重复的CAPS。

例如,使用以下代码:

#filename=temp.py
import argparse
p = argparse.ArgumentParser()
p.add_argument('-i', '--ini', help="use alternate ini file")
print '\n', p.parse_args()

现在正在运行python temp.py -h

usage: temp.py [-h] [-i INI]

optional arguments:
  -h, --help         show this help message and exit
  -i INI, --ini INI  use alternate ini file

现在我想要的是:

usage: 123.py [-h] [-i INI]

optional arguments:
  -h, --help         show this help message and exit
  -i, --ini INI      use alternate ini file

OR

usage: 123.py [-h] [-i INI]

optional arguments:
  -h, --help         show this help message and exit
  -i, --ini          use alternate ini file

要获得第二个,可以将行metavar中的默认p.add_argument更改为:

p.add_argument('-i', '--ini', help="use alternate ini file")

并更改argparse.ArgumentParser()中的默认用法声明。

但是当我的代码中可选参数的数量增加时,我发现很难根据代码中的修改添加和删除参数来修改用法消息。

在不影响使用陈述的情况下,是否有其他方法可以解决metavar的问题。

如果我希望显示我的帮助,如第一种情况所示,INI之后只有一次-i, --ini

如果我在显示-i, --ini INI-i, --ini而非-i INI, --ini INI的帮助时出错,请以正当理由纠正我。 (我的意思是错误,我使用的惯例会导致用户混淆或误解)

2 个答案:

答案 0 :(得分:1)

https://stackoverflow.com/a/9643162/901925https://stackoverflow.com/a/23941599/901925https://stackoverflow.com/a/16969505/901925

进行HelpFormatter._format_action_invocation(self, action)方法修改,将'-i INI, --ini INI'替换为'-i, --ini INI'

'-h, --help'没有CAPS字符串,因为帮助没有参数。 INI只是该论点的占位符。原版只是试图清楚,您可以使用-i 124--ini 124

METAVAR参数可让您控制该占位符,但它用于格式化用法和帮助。

如果您不想使用自定义HelpFormatter类路由,您仍然可以使用自定义使用方法。例如,在开发期间的某个时刻,执行usage = parser.format_usage()。现在更改解析器,使metavar'',使用情况就是新的。

parser = argparse.ArgumentParser()
a1 = parser.add_argument('-f','--foo',help='<foo> argument')
a2 = parser.add_argument('-b','--bar',metavar='CUSTOM',help='<CUSTOM> argunent')
a3 = parser.add_argument('-z','--baz', action='store_true', help='no argument')

usage = parser.format_usage()
parser.usage=usage   # grab original usage
for a in [a1,a2]:
    a.metavar=''   # 'blank' out the metavars that matter
parser.print_help()

产生

usage: usage: stack30704631.py [-h] [-f FOO] [-b CUSTOM] [-z]

optional arguments:
  -h, --help   show this help message and exit
  -f , --foo   <foo> argument
  -b , --bar   <CUSTOM> argunent
  -z, --baz    no argument

答案 1 :(得分:1)

对于快速解决方案,您只需将退格符设置为metavar即可。

p.add_argument('-i', '--ini', help="use alternate ini file", metavar='\b')

它会告诉你:

optional arguments:
  -h, --help         show this help message and exit

如果你想要这个:

  -i, --ini INI      use alternate ini file

您必须修改帮助格式化程序。这里回答python argparse help message, disable metavar for short options?