1

我有类似的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是值而不是字典。

我如何巧妙地完成这项工作?

(欢迎任何其他建议,我的蟒蛇意识仍在培养中......)

4

2 回答 2

6

OptionParser.parse_args返回一个对象,其中选项变量名称作为属性,而不是作为字典键。您收到的错误意味着options不支持下标,通常通过实现__getitem__.

因此,换句话说,您的选择是:

options.optiona
options.optionb

而不是:

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

模板变量替换需要一个类似dict- 的接口,因此它试图使用后一种方法找到 optiona 和 optionb 。

按照他的回答中的建议使用 varsRoadieRich来使模板替换方法起作用。或者,除非您真的需要一个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)
于 2009-05-13T16:29:29.657 回答
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.
于 2009-05-13T16:24:14.750 回答