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.

2338voto

Ayman Hourieh Points 39435

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 possède un attribut :

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

46 votes

Ok, et comment puis-je vérifier l'attribut existant dans la classe ?

12 votes

Et comment transformer en chaîne le nom d'une variable qui n'existe peut-être pas ?

0 votes

@SilentGhost, pouvez-vous élaborer davantage ou donner un exemple ?

190voto

paxdiablo Points 341644

L'utilisation de variables qui n'ont pas encore été définies ou fixées (implicitement ou explicitement) est souvent une mauvaise chose en tout car il tend à indiquer que la logique du programme n'a pas été correctement réfléchie et qu'elle est susceptible d'entraîner un comportement imprévisible.

Si vous besoin de pour le faire en Python, l'astuce suivante, qui est similaire à la vôtre, garantira qu'une variable a un peu de avant de l'utiliser :

try:
    myVar
except NameError:
    myVar = None      # or some other default value.

# Now you're free to use myVar without Python complaining.

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

A titre d'exemple, le code suivant a été donné ci-dessous dans un commentaire, pour permettre le tracé d'une ligne d'un point précédent au point courant :

if last:
    draw(last, current);
last = current

Dans le cas où last n'a pas été liée à une valeur, cela n'aidera pas du tout en Python puisque même la fonction vérification de de last soulèvera une exception. Une meilleure idée serait de s'assurer que last fait a une valeur, une valeur qui peut être utilisée pour décider si elle est valide ou non. Ce serait quelque chose comme :

last = None

# some time passes ...

if last is not None:
    draw(last, current);
last = current

Cela permet de s'assurer que la variable existe et que vous ne l'utilisez que si elle est valable pour ce dont vous avez besoin. C'est ce que je suppose que la if last était signifiait à faire dans le code de commentaire (mais ne l'a pas fait), et vous pouvez toujours ajouter le code à force si vous n'avez aucun contrôle sur le paramètre initial de la variable, en utilisant la méthode d'exception ci-dessus :

# Variable 'last' may or may not be bound to a value at this point.

try:
    last
except NameError:
    last = None

# It will always now be bound to a value at this point.

if last is not None:
    draw(last, current);
last = current

13 votes

Peut-être que c'est une variable d'une dépendance, et selon la version/plateforme, elle peut ou non exister, et il n'y a pas d'autre moyen de savoir quelle est la version.

47 votes

Les variables d'état n'existent pas avant d'être assignées - si vous tracez une ligne de la position précédente à la position actuelle, puis définissez previous = current, cela ne signifie pas que vous "ne connaissez pas vos variables" au premier appel. Et écrire une ligne de code supplémentaire pour initialiser previous=null en dehors de la routine de dessin ne signifie pas que vous "connaissez mieux vos variables".

1 votes

Je ne vois pas où tu veux en venir, Dave. Vous avez raison de dire qu'ils n'existent pas mais, dans ce cas, vous ne devriez pas essayer de les utiliser. Assurez-vous qu'ils faire existe, c'est ce que je suggère.

95voto

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

Puis plus tard :

if myVar is not None:
    # Do something

3 votes

Il y a beaucoup de choses à améliorer dans cette réponse. Plutôt - Un moyen simple est de le déclarer d'abord. myVar = none # do stuff... if not myVar: # give myVar a value myVar = 'something'

1 votes

J'aime beaucoup celui-ci parce que j'ai mis des choses à Aucun dans mon except déclarations

3 votes

Pourquoi pas quelque chose comme : if myVar: # Do something Cela évite de devoir lire un double négatif.

28voto

Wyrmwood Points 207

Pour les objets/modules, vous pouvez également

'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

27voto

L'utilisation de 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 les variables globales.

Par exemple, si vous voulez initialiser une variable de niveau module la première fois que vous appelez une fonction, il est préférable d'utiliser un code comme celui-ci :

my_variable = None

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

2 votes

J'essaie de ne pas l'utiliser, car cela pollue l'espace de noms global. Une façon d'éviter cela est de faire de la fonction une classe, avec ma_variable comme variable de classe, et en définissant appelez en tant que corps de la fonction existante, mais c'est difficile à coder et cela soulève un tas d'autres questions. Je préfère utiliser les attributs de fonction, voir ci-dessous.

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