当您在 argparse.ArgumentParser()
上调用 add_argument
时没有明确的操作,您将获得 “store”
操作。在自动生成的 --help
输出中,您将获得长选项的大写字母,除非您设置 metavar
:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--version', metavar='X.Y.Z')
parser.add_argument('--date'),
parser.parse_args(['--help'])
显示:
usage: try.py [-h] [--version X.Y.Z] [--date DATE]
optional arguments:
-h, --help show this help message and exit
--version X.Y.Z
--date DATE
在此,我将称 X.Y.Z
为显式元变量,将 DATE
称为隐式元变量。
如果你想获得更有用的帮助,你可以这样做:
parser.add_argument('--version', metavar='X.Y.Z',
help = "set version to % (metavar)s")
给出(仅显示更改的行):
--version X.Y.Z set version to X.Y.Z
并且能够在帮助字符串中使用 %(metavar)s
很好,因为当您更改 metavar='MAJOR.MINOR'
时,帮助不会'不需要更新(您一定会忘记)。
但是,如果您使用隐式元变量为 --date
参数添加帮助:
parser.add_argument('--date',
help="use %(metavar)s instead of today's date")
你得到:
--date DATE use None instead of today
None
不是我所期望的,也不是我想要的。
当然,我总是可以在帮助中对“DATE”进行硬编码,或者明确提供元变量(尤其是在帮助字符串中使用它时)。但是当我这样做时,我一定会忘记在更改长选项的名称时更新元变量。
是否有一种“自动”方式来获取帮助字符串中的 DATE
而不是 None
?
或者我在使用 %(metavar)s
我应该使用其他东西(如果是的话,是什么)?
最佳答案
在调用 parser.parse_args()
之前,您可以做的一件事是更新添加到 parser
的那些具有 metavar
属性的操作是无
:
for action in parser._actions:
if not hasattr(action, 'metavar') or not hasattr(action, 'dest'):
continue
metavar = getattr(action, 'metavar')
if metavar is None:
action.metavar = action.dest.upper()
生成的输出如下:
--version X.Y.Z set version to X.Y.Z
--date DATE use DATE instead of today
但正如我们用 BDFL 的母语所说:“mooi is anders”¹
¹ 美丽的外表不同
关于python - 访问参数帮助字符串中的 "implicit"元变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51085465/