web-dev-qa-db-fra.com

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.

Y a-t-il d'autres moyens sans exceptions?

804
Max Frai

Pour vérifier l'existence d'une variable locale:

if 'myVar' in locals():
  # myVar exists.

Pour vérifier l'existence d'une variable globale:

if 'myVar' in globals():
  # myVar exists.

Pour vérifier si un objet a un attribut:

if hasattr(obj, 'attr_name'):
  # obj.attr_name exists.
1396
Ayman Hourieh

L’utilisation de variables qui n’ont pas été définies ou définies (implicitement ou explicitement) est presque toujours une mauvaise chose dans le langage any car elle indique que la logique du programme n’a pas été bien pensée, et est susceptible d'entraîner un comportement imprévisible.

L'astuce suivante, similaire à la vôtre, garantira qu'une variable a une valeur quelques-uns avant utilisation:

try:
    myVar
except NameError:
    myVar = None
# Now you're free to use myVar without Python complaining.

Cependant, je ne pense toujours pas que ce soit une bonne idée - à mon avis, vous devriez refactoriser votre code afin que cette situation ne se produise pas.

109
paxdiablo

Un moyen simple consiste à l'initialiser en disant d'abord myVar = None

Puis plus tard:

if myVar is not None:
    # Do something
35

Utiliser try/except est le meilleur moyen de tester l'existence d'une variable. Mais il est presque certainement une meilleure façon de faire ce que vous faites que de définir/tester des variables globales.

Par exemple, si vous voulez initialiser une variable au niveau du module la première fois que vous appelez une fonction, utilisez un code similaire à ceci:

my_variable = None

def InitMyVariable():
  global my_variable
  if my_variable is None:
    my_variable = ...
21
user97370

pour les objets/modules, vous pouvez aussi

'var' in dir(obj)

Par exemple,

>>> class Something(object):
...     pass
...
>>> c = Something()
>>> c.a = 1
>>> 'a' in dir(c)
True
>>> 'b' in dir(c)
False
16
Wyrmwood

Je suppose que le test va être utilisé dans une fonction similaire à réponse de l'utilisateur9737 . Je n'aime pas cette réponse car elle pollue l'espace de noms global. Une façon de résoudre ce problème consiste à 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 ça, parce que cela complique le code et ouvre des questions telles que: faut-il que cela confirme le modèle de programmation Singleton? Heureusement, Python a autorisé les fonctions à avoir des attributs pendant un certain temps, ce qui nous donne cette solution simple:

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

catch est appelé except en Python. à part ça, c'est bien pour des cas aussi simples. Il existe le AttributeError qui peut être utilisé pour vérifier si un objet a un attribut.

8
SilentGhost

C'est juste un ajout aux réponses précédentes pour vérifier si une clé est présente dans JSON/Dict ou non dans python

'Nom d'objet Json/Dict'. A_key ('nom de clé')

cela retournera vrai ou faux

5
Arun Ravindranath

Une façon qui fonctionne souvent bien pour gérer ce genre de situation est de ne pas vérifier explicitement si la variable existe, mais simplement d'envelopper la première utilisation de la variable éventuellement non existante dans une erreur 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
  ...
5
Roger Dahl