getopts Значения класса и Template.Substitute не (сразу) работают вместе - PullRequest
1 голос
/ 13 мая 2009

У меня есть код 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 это значения, а не словарь.

Как мне аккуратно заставить это работать?

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

Ответы [ 2 ]

6 голосов
/ 13 мая 2009

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)
4 голосов
/ 13 мая 2009

Мне кажется, что работает следующее:

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