2009-05-13 3 views
1

J'ai code python quelque chose comme:getopts classe et valeurs Template.Substitute ne sont pas (immédiatement) travaillent ensemble

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) 

Mais cela me donne

AttributeError: Values instance has no attribute '__getitem__' 

Parce que options est une des valeurs et non un dictionnaire.

Comment est-ce que je fais parfaitement ce travail?

(toute autre suggestion bienvenue, mon sens pythonique est toujours nourri ...)

Répondre

4

Voici semble fonctionner pour moi:

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

merci . Je savais que ce ne serait que quelques caractères ... – Greg

6

OptionParser.parse_args retourne un objet avec les noms de variables d'options comme attributs, plutôt que comme des clés de dictionnaire. L'erreur que vous obtenez signifie que options ne prend pas en charge l'indice, ce qu'il ferait normalement en implémentant __getitem__.

Ainsi, en d'autres termes, vos options sont à l'adresse:

options.optiona 
options.optionb 

Plutôt que:

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

modèle variable de substitution attend une interface dict -comme, il essaie de trouver optiona et optionb en utilisant la dernière approche.

Utiliser les variables comme RoadieRich suggère dans sa réponse de faire fonctionner l'approche de substitution de modèle. Sinon, à moins que vous avez vraiment besoin d'un objet Template, je vous recommande d'utiliser simple print:

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

Vous pouvez également combiner les deux approches si vous pensez que les paramètres de chaîne nommés sont mieux:

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

IIRC, le seul problème avec la substitution "traditionnelle" est qu'il est obsolète dans Python 3.1. – RoadieRich

+0

Votre première suggestion ne fonctionne pas très bien pour moi, car il y a en fait 7 options, et le texte pour les remplacer est ~ 50 lignes. Mais merci pour l'explication. – Greg

Questions connexes