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

Gre*_*reg 1 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)
Run Code Online (Sandbox Code Playgroud)

但这给了我

AttributeError: Values instance has no attribute '__getitem__'
Run Code Online (Sandbox Code Playgroud)

因为options是值而不是字典.

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

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

Jar*_*die 6

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

换句话说,您的选择是:

options.optiona
options.optionb
Run Code Online (Sandbox Code Playgroud)

而不是:

options['optiona']
options['optionb']
Run Code Online (Sandbox Code Playgroud)

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

RoadieRich在他的回答中建议使用变量使模板替换方法起作用.或者,除非你真的需要一个Template对象,否则我建议使用一个简单的print:

print 'Option a is %s and option b is %s' % (options.optiona, options.optionb)
Run Code Online (Sandbox Code Playgroud)

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

print 'Option a is %(optiona)s and option b is %(optionb)s' % vars(options)
Run Code Online (Sandbox Code Playgroud)