我有类似这样的 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 感觉仍在培养中......)
请您参考如下方法:
OptionParser.parse_args 返回一个以选项变量名称作为属性而不是字典键的对象。您得到的错误意味着 options 不支持下标,这通常通过实现 __getitem__ 来实现。
所以,换句话说,您的选择是:
options.optiona
options.optionb
而不是:
options['optiona']
options['optionb']
模板变量替换需要类似 dict 的接口(interface),因此它尝试使用后一种方法查找 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)
