2010-01-28 6 views
28

Comment faire référence à this_prize.left ou this_prize.right en utilisant une variable?Accéder à un attribut en utilisant une variable en Python

from collections import namedtuple 
import random 

Prize = namedtuple("Prize", ["left", "right"]) 
this_prize = Prize("FirstPrize", "SecondPrize") 

if random.random() > .5: 
    choice = "left" 
else: 
    choice = "right" 

# retrieve the value of "left" or "right" depending on the choice 
print("You won", this_prize.choice) 

AttributeError: 'Prize' object has no attribute 'choice' 
+5

Pour votre information - Vous pouvez sauter les collections d'importation et il suffit d'utiliser un dictionnaire pour faire la même chose: >>> this_prize = { « gauche »: « FirstPrize "," right ":" FirstPrize "} >>> this_prize [choix] > 'FirstPrize' –

+0

Connexe: http://stackoverflow.com/questions/1167398/python-access-class-property-from-string –

Répondre

52

L'expression this_prize.choice raconte l'interprète que vous souhaitez accéder à un attribut de this_prize avec le nom "choix". Mais cet attribut n'existe pas dans this_prize.

Qu'est-ce que vous voulez réellement est de renvoyer l'attribut de this_prize identifié par la valeur de choix. Donc, vous avez juste besoin de changer la dernière ligne ...

from collections import namedtuple 

import random 

Prize = namedtuple("Prize", ["left", "right" ]) 

this_prize = Prize("FirstPrize", "SecondPrize") 

if random.random() > .5: 
    choice = "left" 
else: 
    choice = "right" 

#retrieve the value of "left" or "right" depending on the choice 

print "You won", getattr(this_prize,choice) 
47
+1

Je pense que c'est la façon générique d'accomplir la tâche. Puisqu'il utilise la fonction intégrée conçue à cet effet, il devrait vraiment être la réponse préférée. (Oui, je me rends compte que c'est une vieille question, mais il apparaît toujours dans Google.) – monotasker

Questions connexes