2009-04-15 5 views
28

Est-il possible de vérifier si une variable (membre de la classe ou autonome) avec le nom spécifié est définie? Exemple:Un moyen facile de vérifier qu'une variable est définie en python?

if "myVar" in myObject.__dict__ : # not an easy way 
    print myObject.myVar 
else 
    print "not defined" 
+0

classe de tiers, besoin de définir un indicateur pour mon usage privé, ne veulent pas désordonner la classe __init __() – grigoryvp

+0

C'est vraiment déroutant. Pourquoi écrire beaucoup de code pour déterminer quelles variables sont utilisées? Créez simplement une instance, imprimez l'instance .__ dict __. Keys() ou faites dir (instance) et vous connaissez tous les noms d'attributs. –

+0

J'ai peur que je sois aussi confus. La question porte sur les membres de la classe et sur les vars autonomes. Évidemment, il n'y a pas de __init__ pour les vars autonomes de haut niveau; Qu'est-ce qu'un tiers des miasmes est si mal construit que tant de ses variables, à plusieurs niveaux, risquent d'être complètement inexistantes? –

Répondre

27

Une façon compacte:

print myObject.myVar if hasattr(myObject, 'myVar') else 'not defined' 

la manière de HTW est plus Pythonic, cependant.

hasattr() est différent de x in y.__dict__, cependant: hasattr() prend des attributs de classe hérités en compte, ainsi que les dynamiques de retour __getattr__, alors que y.__dict__ ne contient que les objets qui sont des attributs de l'instance y.

+0

Je pense qu'il cherche juste hasattr(). – monkut

+0

Oui, très probablement. Et qu'en est-il d'une variable globale? (déclaré dans le module, pas dans un espace de noms de classe)? – grigoryvp

+0

@Eye of Hell: peut-être (x dans globals()), mais ma vraie réponse serait que le code qui doit faire cela est un-Pythonic et devrait vraiment être l'initialisation de la variable à None. – Miles

21
try: 
    print myObject.myVar 
except NameError: 
    print "not defined" 
+0

Au moins obtenir les variables et la sortie à droite :-) +1 – paxdiablo

+16

Si myObject est défini, mais n'a pas de 'myVar', vous obtiendrez une erreur AttributeError à la place. –

9

Paolo est juste, il peut y avoir quelque chose hors de la façon dont vous faites les choses si cela est nécessaire. Mais si vous faites juste quelque chose de rapide et sale vous ne vous souciez probablement pas de Idiomatic Python, alors cela peut être plus court.

try: x 
except: print "var doesn't exist" 
4

Lire et ou astuces en python: 'a' dans locals() et un

+0

Echoue si a est la chaîne vide ou toute autre valeur falsifiée. –

4

Pour tester si la variable, myvar, est défini: est défini

result = dir().count('myvar') 

Si myvar, le résultat est 1, sinon ce serait 0.

Cela fonctionne très bien dans Python version 3.1.2.

+0

Pourquoi ne pas juste "myvar" dans dir() ', alors? – rdb

Questions connexes