【问题标题】:Python Can metavar of argparse option be accessed?Python 可以访问 argparse 选项的元变量吗?
【发布时间】:2014-07-26 23:16:33
【问题描述】:

我想知道是否有一种方法可以使用从其他地方获取的 argparse 中的元变量。例如,有一个 -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)

我知道这段代码是错误的(字符串没有元变量,并且在 parser.parse_args() 运行之前不会设置选项),但我有几次其他时候我只想抓住元变量而没有一堆:

 meta_file = 'FILE'
 meta_dir = 'DIR'
 meta_inquisition = 'SURPRISE'

飘来飘去。

谢谢。

编辑: s/add_option/add_argument/

【问题讨论】:

  • 我不这么认为。有很多问题要求在“帮助”中使用“默认”参数。而且没有办法。

标签: python argparse


【解决方案1】:

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 内容如下:

用法:ipython [-h] [-f 文件] [-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

https://docs.python.org/3/library/argparse.html#help

帮助字符串可以包含各种格式说明符,以避免重复程序名称或参数默认值等内容。可用的说明符包括程序名称、%(prog)s 和 add_argument() 的大多数关键字参数,例如%(default)s、%(type)s 等:

我正在使用action1.metavarFILE 放在action2 的帮助行中。这不是一个常见的用法,但我看不出有什么问题。

请注意,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'

py3 样式格式可用于action2

help2="Directory of {} if it is not current directory".format(action2.metavar)
action2.help = help2

py2 样式必须用于action1。除非你这样做

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

【讨论】:

  • 这看起来很有希望。我会用我的东西完成它。还要感谢 add_argument。仍然在我的大脑中使用 optparse。
  • 宾果游戏。感谢您的帮助。
  • 遗憾的是它不适用于从--my-option 计算的默认metavar:您必须明确给出metavar=。 Python 3.6.5。
【解决方案2】:

根据the docs for the help argument,帮助文本可以包含%(default)s%(type)s等格式说明符。你可以写%(metavar)s,它将扩展为元变量的值(或None如果它没有指定)。

我认为没有办法获取他人的论点元变量。

【讨论】:

  • 注意s%(metavar)之后的重要性,我看文档的时候没明白。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-01
  • 2016-11-01
  • 1970-01-01
  • 2015-09-04
  • 2013-11-03
  • 2012-07-31
相关资源
最近更新 更多