Skip to main content
 首页 » 编程设计

python之getopts Values 类和 Template.Substitute 不(立即)一起工作

2025年05月04日13softidea

我有类似这样的 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)