2010-11-16 5 views
0

Je suis en train de mettre des booléens en fonction de si un objet a ou non des attributs:python essayer plusieurs déclarations avec la même erreur possible

try: 
    att1 = myobj.att1 
    att2 = myobj.att2 
    att3 = myobj.att3 
except AttributeError: 
    pass 

Toutefois, si att1 n'est pas présent et jette un AttributeError, il a gagné Essayons pas les deux autres. Dois-je faire une boucle (n'y a-t-il aucun moyen de le faire dans une déclaration try?)

Merci!

Répondre

1

Pas besoin d'une déclaration d'essai ici. Par exemple:

myobj = 10 
names = ['att1', 'att2', 'att3', 'real'] 
results = dict((name, getattr(myobj, name, None)) for name in names) 
#{'real': 10, 'att3': None, 'att2': None, 'att1': None} 
+0

Tout à fait vrai. J'aime cette fonction getattr. – ash

+0

Très peu de langages rendent la méta programmation aussi simple et aussi propre que python. – marr75

0

Utilisez-vous cette seulement pour vérifier si certains objets ont des attributs? Dans ce cas, utilisez la fonction intégrée hasattr (qui, en fait, fait le même test que vous avez mis en œuvre manuellement de toute façon.


Sinon, vous devez boucle.

Si vous pensez à la structure du code, ce que vous voulez vraiment, c'est trois essayer ... sauf les blocs - après tout, si les exceptions renvoyaient le flux à l'endroit où elles avaient été traitées, elles ne seraient pas très exceptionnelles!

Ce serait plutôt facile pour écrire une boucle, cependant:

atts = [] 
for attr in ("att1", "att2", "att3"): 
    try: 
     attrs.append(getattr(myobj, attr)) 
    except AttributeError: 
     attrs.append[None] 
att1, att2, att3 = atts 

Si vous voulez vraiment les attributs que les variables locales, vous pourriez même faire:

for attr in ("att1", "att2", "att3"): 
    try: 
     locals()[attr] = getattr(myobj, attr) 
    except AttributeError: 
     pass 
+0

Génial. Je ne testais pas pour la simple existence, donc je suppose que je dois boucler. Merci pour l'explication. – ash

3

pourquoi ne pas simplement faire:

your_boolean = hasattr(obj, att1) or hasattr(obj, att2) or hasattr(obj, att3) 
0

Considérant qu'il existe 2 * 2 * 2 combinaisons d'existence possibles, pourquoi ne pas avoir défini?

set(attr for attr in ('att%i' for i in range(1,4)) if obj.hasattr(attr)) 
0

Je pense que cela fonctionne aussi:

try: 
    (var1 and var2) 
except NameError: 
    ... 

Il testera toutes les variables avant de prendre une décision.

Questions connexes