Déterminer si la variable est définie en Python [dupliquer]

Double Possible:

moyen Facile de vérifier que la variable est définie en python?

Comment puis-je vérifier si une variable existe en Python?

Comment savez-vous si une variable a été définie à un endroit précis du code à l'exécution? Ce n'est pas toujours évident parce que (1) la variable pourrait être de manière conditionnelle, et (2) la variable peut être conditionnellement supprimés. Je cherche quelque chose comme defined() en Perl ou isset() en PHP ou defined? en Ruby.

if condition:
    a = 42

# is "a" defined here?

if other_condition:
    del a

# is "a" defined here?
312
demandé sur Community 2009-10-20 09:03:36

7 réponses

try:
  thevariable
except NameError:
  print "well, it WASN'T defined after all!"
else:
  print "sure, it was defined."
504
répondu Alex Martelli 2015-02-17 16:36:17

'a' in vars() or 'a' in globals()

si vous voulez être pédant, vous pouvez vérifier les builtins aussi

'a' in vars(__builtins__)

267
répondu John La Rooy 2018-06-12 23:47:52

je pense qu'il vaut mieux éviter la situation. C'est plus propre et plus clair d'écrire:

a = None
if condition:
    a = 42
105
répondu divegeek 2009-10-20 05:15:44
try:
    a # does a exist in the current namespace
except NameError:
    a = 10 # nope
12
répondu sc45 2009-10-20 06:47:26

Une situation où cela peut être nécessaire:

si vous utilisez finally pour fermer les connexions mais dans le bloc try , le programme sort avec sys.exit() avant que la connexion ne soit définie. Dans ce cas, le bloc finally sera appelé et la déclaration de fermeture de connexion échouera car aucune connexion n'a été créée.

5
répondu xsreality 2011-12-28 14:20:36

pour ce cas particulier, il est préférable de faire a = None au lieu de del a . Ce compte de référence de décrément pour l'objet a a été (s'il y a lieu) assigné à et ne sera pas échoué lorsque a n'est pas défini. Notez que la déclaration del n'appelle pas directement le destructeur d'un objet, mais le décroche de la variable. Le destructeur d'objet est appelé quand le nombre de référence est devenu zéro.

4
répondu Denis Otkidach 2009-10-20 06:30:24

si l'on veut attraper des tentatives d'accéder à une variable non définie à l'intérieur d'un objet, il y a une façon très facile de le faire:

class Whatever(object):
  def __getattr__(self, key):
    return None

ici, python essaie d'abord de trouver un attribut dans l'objet ou l'arbre d'objets, et seulement si cela échoue la fonction __getattr__(self, key) est appelée. Cela signifie que, si __getattr__ est appelé nous pouvons simplement retourner None .

-3
répondu user1456683 2012-06-14 22:14:51