getopts值类与Template.Substitute不立即兼容

1 投票
2 回答
1521 浏览
提问于 2025-04-15 11:34

我有一段类似这样的Python代码:

from string import Template
import optparse

def main():
  usage = "usage: %prog options outputname"
  p = optparse.OptionParser(usage)
  p.add_option('--optiona', '-a', default="")
  p.add_option('--optionb', '-b', default="")
  options, arguments = p.parse_args()
  t = Template('Option a is ${optiona} option b is ${optionb}')
  print t.substitute(options)

但是运行后我得到了

AttributeError: Values instance has no attribute '__getitem__'

因为 options 是一个值,而不是一个字典。

我该怎么才能让它正常工作呢?

(任何其他建议都欢迎,我的Python技能还在慢慢提升中……)

2 个回答

6

OptionParser.parse_args 返回的是一个对象,这个对象的属性名就是你定义的选项变量名,而不是像字典那样用键来表示。你遇到的错误意味着 options 这个对象不支持用下标访问,通常它是通过实现 __getitem__ 来做到这一点的。

换句话说,你的选项可以这样访问:

options.optiona
options.optionb

而不是这样:

options['optiona']
options['optionb']

模板变量替换需要一个类似于 dict 的接口,所以它试图用后者的方式来查找 optiona 和 optionb。

可以按照 RoadieRich 在他的回答中建议的那样使用 vars,这样模板替换就能正常工作。或者,如果你不太需要 Template 对象,我建议直接使用简单的 print

print 'Option a is %s and option b is %s' % (options.optiona, options.optionb)

如果你觉得用命名字符串参数更好,也可以把这两种方法结合起来:

print 'Option a is %(optiona)s and option b is %(optionb)s' % vars(options)
4

下面的代码对我来说似乎有效:

from string import Template
import optparse

def main():
    usage = "usage: %prog options outputname"
    p = optparse.OptionParser(usage)
    p.add_option('--optiona', '-a', default="")
    p.add_option('--optionb', '-b', default="")
    options, arguments = p.parse_args()
    t = Template('Option a is ${optiona} option b is ${optionb}')
    print t.substitute(vars(options)) #I'm assuming the uppercase S was a typo.

撰写回答