getopts值类与Template.Substitute不立即兼容
我有一段类似这样的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.