getopts值类和Template.Substitute不会(立即)一起工作

时间:2009-05-13 15:55:58

标签: python templates getopts

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

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

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

2 个答案:

答案 0 :(得分:6)

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

因此,换句话说,您的选项位于:

options.optiona
options.optionb

而不是:

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

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

使用vars作为RoadieRich在他的回答中建议使模板替换方法有效。或者,除非您确实需要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)

答案 1 :(得分: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.