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意识仍在培养...)
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)
| 归档时间: |
|
| 查看次数: |
1503 次 |
| 最近记录: |