1

私は次のような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センスはまだ育まれています...)

4

2 に答える 2

6

OptionParser.parse_argsディクショナリキーではなく、属性としてオプション変数名を持つオブジェクトを返します。発生するエラーはoptions、添え字をサポートしていないことを意味します。これは、通常、を実装することでサポートされ__getitem__ます。

つまり、言い換えると、オプションは次のとおりです。

options.optiona
options.optionb

それよりも:

options['optiona']
options['optionb']

テンプレート変数の置換は、 -のdictようなインターフェイスを想定しているため、後者のアプローチを使用してoptionaとoptionbを見つけようとしています。

RoadieRichテンプレート置換アプローチを機能させるために、彼の回答で示唆されているようにvarsを使用してください。または、本当にオブジェクトが必要でない限りTemplate、単純なものを使用することをお勧めしますprint

print 'Option a is %s and option b is %s' % (options.optiona, options.optionb)

名前付き文字列パラメータの方が優れていると思われる場合は、2つのアプローチを組み合わせることもできます。

print 'Option a is %(optiona)s and option b is %(optionb)s' % vars(options)
于 2009-05-13T16:29:29.657 に答える
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.
于 2009-05-13T16:24:14.750 に答える