Python argparse 选项的 metavar 可以访问吗?

4 投票
2 回答
1757 浏览
提问于 2025-04-18 08:47

我在想,是否有办法让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 个回答

1

根据关于help参数的文档,帮助文本可以包含一些格式说明符,比如%(default)s%(type)s等等。你可以写%(metavar)s,它会被替换成metavar的值(如果没有指定,就会变成None)。

我觉得没有办法获取其他参数的metavar。

4

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 编程。

撰写回答