Python argparse 选项的 metavar 可以访问吗?
我在想,是否有办法让argparse中的metavar从其他地方获取。举个例子,有一个-f FILE选项,还有一个-d DIR选项。我能不能让-d的帮助信息抓取file.metavar或者类似的东西呢?
也许是这样的:
parser.add_argument("-f", "--file",
metavar = 'FILE',
action="store", dest="file_name", default="foo.bar",
help="Name of the {} to be loaded".format(metavar))
parser.add_argument("-d", "--dir",
metavar = 'DIR',
action = 'store', dest='file_dir', default=".",
help="Directory of {} if it is not current directory".format(option.file_name.metavar)
我知道这段代码是错的(字符串没有metavar,而且选项在运行parser.parse_args()之前是不会被设置的),但我有几次想要直接获取metavar,而不想到处都是这样的:
meta_file = 'FILE'
meta_dir = 'DIR'
meta_inquisition = 'SURPRISE'
。
谢谢。
编辑:把add_option改成add_argument
2 个回答
根据关于help
参数的文档,帮助文本可以包含一些格式说明符,比如%(default)s
、%(type)s
等等。你可以写%(metavar)s
,它会被替换成metavar的值(如果没有指定,就会变成None
)。
我觉得没有办法获取其他参数的metavar。
在 argparse
里,有一个叫 add_argument()
的方法。这个方法会返回一个 Action
对象(实际上是根据 action
参数的不同,返回不同的子类)。你可以访问这个对象的各种参数,既可以使用,也可以修改。比如:
action1 = parser.add_argument(
"-f",
"--file",
metavar = "FILE",
dest="file_name",
default="foo.bar",
help="Name of the %(metavar)s to be loaded"
)
action2 = parser.add_argument(
"-d",
"--dir",
metavar="DIR",
dest="file_dir",
default=".",
help="Directory of %s if it is not current directory" % action1.metavar
)
print(action1.metavar) # read the metavar attribute
action2.metvar = "DIRECTORY" # change the metavar attribute
这里的 help
内容是:
usage: ipython [-h] [-f FILE] [-d DIR]
optional arguments:
-h, --help show this help message and exit
-f FILE, --file FILE Name of the FILE to be loaded
-d DIR, --dir DIR Directory of FILE if it is not current directory
我去掉了 action="store"
,因为这是默认值(没什么大不了的)。
我把 help
的值改成了 %(metavar)s
。这个用法是为了包含各种 action
属性。最常见的就是用来表示 default
的值。
根据 argparse
的 文档:
帮助字符串可以包含各种格式说明符,以避免重复显示程序名称或参数默认值。可用的说明符包括程序名称 %(prog)s 和大多数传给
add_argument()
的关键字参数,比如 %(default)s、%(type)s 等等:
我使用 action1.metavar
来在 action2
的帮助信息中放入 FILE
。这不是常见用法,但我觉得没什么问题。
注意,action1.metavar
在设置解析器时使用一次(用来创建 action2
的帮助信息),然后在格式化 help
时再使用一次。
In [17]: action2.help
Out[17]: 'Directory of FILE if it is not current directory'
In [18]: action1.help
Out[18]: 'Name of the %(metavar)s to be loaded'
可以对 action2
使用 py3
风格的格式化:
help2 = "Directory of {} if it is not current directory".format(action2.metavar)
action2.help = help2
但是 action1
必须使用 py2
风格。除非你这样做:
action1.help = "Name of the {} to be loaded".format(action1.metavar)
在创建了两个动作后,你甚至可以使用:
action1.help = "Name of the {} to be loaded from {}".format(action1.metavar, action2.metavar)
但这只是普通的 Python 编程。