我有类似的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意识仍在培养......)
答案 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.