2009-05-13 4 views
1

ich Python-Code so etwas wie haben:getopts Werte Klasse und Template.Substitute nicht (sofort) zusammenarbeiten, um

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) 

Aber das gibt mir

AttributeError: Values instance has no attribute '__getitem__' 

Da options A-Werte und nicht ein Wörterbuch.

Wie ordentlich ich diese Arbeit machen?

(andere Vorschläge willkommen, mein pythonic Sinn noch gepflegt wird ...)

Antwort

4

Es erscheint für mich zu arbeiten:

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

Dank . Ich wusste, dass es nur ein paar Zeichen lang sein würde ... – Greg

6

OptionParser.parse_args ein Objekt mit den Variablennamen Option kehrt als Attribute, anstatt als Wörterbuchschlüssel. Der Fehler Sie bedeutet, dass man, dass options nicht Subskribierung nicht unterstützt, die es durch die Umsetzung __getitem__ normalerweise tun würde.

So sind mit anderen Worten, Ihre Optionen an:

options.optiona 
options.optionb 

Statt:

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

Template Variablensubstitution erwartet einen dict -artige Schnittstelle, so dass es optiona und optionb zu finden versucht, mit dem letzteren Ansatz.

Verwenden vars als RoadieRich in seiner Antwort schlägt die Vorlage Substitutionsansatz Arbeit zu machen. Alternativ, wenn Sie wirklich ein Template Objekt benötigen, würde ich empfehlen, ein mit einfachen print:

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

können Sie auch die beiden Ansätze kombinieren, wenn Sie das Gefühl, dass namens String-Parameter besser sind:

print 'Option a is %(optiona)s and option b is %(optionb)s' % vars(options) 
+0

IIRC, das einzige Problem, mit der „traditionellen“ Substitution ist, dass es in Python 3.1 veraltet ist wird. – RoadieRich

+0

Ihr erster Vorschlag funktioniert nicht so gut für mich, denn es gibt tatsächlich 7 Optionen sind, und der Text sie in ist ~ 50 Zeilen zu ersetzen. Aber danke für die Erklärung. – Greg

Verwandte Themen