1404 votes

Comment vérifier si une variable existe ?

Je veux vérifier si une variable existe. Maintenant, je fais quelque chose comme ça :

try:
   myVar
except NameError:
   # Do something.

Existe-t-il d'autres moyens sans exception ?

25 votes

Quel est le problème de l'exception ?

16 votes

@S.Lott : si myVar est quelque chose de vraiment compliqué, qui prend beaucoup de temps à produire/évaluer, ne serait-ce pas le try ralentir les choses ?

7 votes

@dbliss : C'est une variable. A part quelques cas vraiment bizarres si tu fais quelque chose de fou avec exec ou des métaclasses, ça ne va pas être cher.

12voto

samwyse Points 435

Je vais supposer que le test va être utilisé dans une fonction, similaire à La réponse de user97370 . Je n'aime pas cette réponse car elle pollue l'espace de noms global. Une façon d'y remédier est d'utiliser une classe à la place :

class InitMyVariable(object):
  my_variable = None

def __call__(self):
  if self.my_variable is None:
   self.my_variable = ...

Je n'aime pas cela, car cela complique le code et soulève des questions telles que : doit-on confirmer le modèle de programmation Singleton ? Heureusement, Python permet depuis un certain temps aux fonctions d'avoir des attributs, ce qui nous donne cette solution simple :

def InitMyVariable():
  if InitMyVariable.my_variable is None:
    InitMyVariable.my_variable = ...
InitMyVariable.my_variable = None

9voto

SilentGhost Points 79627

catch s'appelle except en Python. En dehors de cela, c'est très bien pour des cas aussi simples. Il y a le AttributeError qui peut être utilisé pour vérifier si un objet possède un attribut.

8voto

Abhishek R Points 923

J'ai créé une fonction personnalisée.

def exists(var):
     return var in globals()

Ensuite, on appelle la fonction comme suit en remplaçant variable_name avec la variable que vous voulez vérifier :

exists("variable_name")

Reviendra True o False

2 votes

Qu'en est-il des variables locales ? Peut-être que cette fonction doit aussi vérifier les variables locales.

6voto

Roger Dahl Points 8326

Une méthode qui fonctionne souvent bien pour gérer ce genre de situation est de ne pas vérifier explicitement si la variable existe mais de simplement aller de l'avant et d'envelopper la première utilisation de la variable éventuellement inexistante dans un try/except NameError :

# Search for entry.
for x in y:
  if x == 3:
    found = x

# Work with found entry.
try:
  print('Found: {0}'.format(found))
except NameError:
  print('Not found')
else:
  # Handle rest of Found case here
  ...

3voto

RGD2 Points 189

Comme ça :

def no(var):
    "give var as a string (quote it like 'var')"
    assert(var not in vars())
    assert(var not in globals())
    assert(var not in vars(__builtins__))
    import keyword
    assert(var not in keyword.kwlist)

Puis plus tard :

no('foo')
foo = ....

Si votre nouvelle variable foo n'est pas sûr à utiliser, vous obtiendrez une AssertionError exception qui indiquera la ligne qui a échoué, et vous serez alors mieux informé. Voici l'autoréférence artificielle évidente :

no('no')

---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
<ipython-input-88-d14ecc6b025a> in <module>
----> 1 no('no')

<ipython-input-86-888a9df72be0> in no(var)
      2     "give var as a string (quote it)"
      3     assert( var not in vars())
----> 4     assert( var not in globals())
      5     assert( var not in vars(__builtins__))
      6     import keyword

AssertionError:

0 votes

Dans python3, la ligne avec __builtins__ devrait être remplacé par : import builtins assert( var not in vars(builtins)) Et ce n'est probablement pas une mauvaise pratique que de terminer la définition avec une balise return True afin que vous puissiez écrire des choses comme assert no('foo') ce qui est plus clair.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X