2009-05-13 4 views
1

У меня есть питон код что-то вроде:getopts Значения класса и Template.Substitute не (сразу) работают вместе

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 является значения и не словарь.

Как я могу сделать эту работу?

(любые другие предложения приветствуются, мой вещий смысл все еще лелеял ...)

ответ

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. 
+0

благодаря , Я знал, что это всего лишь несколько символов ... – Greg

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) 
+0

IIRC, единственная проблема с «традиционной» заменой заключается в том, что она устарела в Python 3.1. – RoadieRich

+0

Ваше первое предложение не так хорошо работает для меня, так как на самом деле есть 7 опций, а текст для их замены составляет ~ 50 строк. Но спасибо за объяснение. – Greg