Question Comment puis-je 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 exceptions?


617
2018-05-09 13:10


origine


Réponses:


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.

1099
2018-05-09 13:16



L'utilisation de variables qui n'ont pas été définies ou définies (implicitement ou explicitement) est presque toujours une mauvaise chose tout langage car il indique que la logique du programme n'a pas été correctement réfléchie et risque d'entraîner un comportement imprévisible.

Le tour suivant, qui est similaire au vôtre, assurera qu'une variable a certains valeur 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 c'est une bonne idée - à mon avis, vous devriez refactoriser votre code afin que cette situation ne se produit pas.


84
2018-05-09 13:19



Utiliser try / except est la meilleure façon de tester l'existence d'une variable. Mais il y a 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, il vaut mieux utiliser du code comme ceci:

my_variable = None

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

17
2018-05-09 13:27



Une manière simple est de l'initialiser en disant d'abord myVar = None

Puis plus tard:

if myVar is not None:
    # Do something

15
2018-06-04 18:46



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

13
2017-10-28 18:39



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 parce qu'elle pollue l'espace de noms global. Une façon de le réparer 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 ça, parce que cela complique le code et ouvre des questions telles que, devrait-elle confirmer le modèle de programmation de Singleton? Heureusement, Python a permis aux fonctions d'avoir des attributs pour un moment, ce qui nous donne cette solution simple:

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

7
2018-03-25 20:31



catch est appelé except en Python. à part ça, ça va pour des cas aussi simples. Il y a le AttributeError Cela peut être utilisé pour vérifier si un objet a un attribut.


6
2018-05-09 13:12