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.

2voto

James Points 1636

Ce n'est peut-être pas performant, mais vous généralisez la solution à une fonction qui vérifie à la fois les variables locales et les variables globales.

import inspect
def exists_var(var_name):
    frame = inspect.currentframe()
    try:
        return var_name in frame.f_back.f_locals or var_name in globals()
    finally:
        del frame

Alors vous pouvez l'utiliser comme ceci :

exists_var('myVar')

1voto

Variante courte :

my_var = some_value if 'my_var' not in globals() else my_var:

0 votes

C'est un bon système pour un cas d'utilisation que nous rencontrons dans Databricks. Ce n'est pas un très bon système pour les programmes détaillés, car l'exécution d'un notebook à partir d'un autre englobera les mêmes variables nommées. Pour réduire le nombre de variables bloquées, utilisez une valeur préexistante si elle existe.

0voto

Jens Points 1073

C'était mon scénario :

for i in generate_numbers():
    do_something(i)
# Use the last i.

Je ne peux pas déterminer facilement le longueur de l'itérable et cela signifie que i peut exister ou non selon que l'itérable produit ou non une séquence vide.

Si je veux utiliser le dernier i de l'itérable (un i qui n'existe pas pour une séquence vide), je peux faire l'une des deux choses suivantes :

i = None  # Declare the variable.
for i in generate_numbers():
    do_something(i)
use_last(i)

o

for i in generate_numbers():
    do_something(i)
try:
    use_last(i)
except UnboundLocalError:
    pass  # i didn’t exist because sequence was empty.

La première solution mai être problématique car je ne peux pas dire (en fonction des valeurs de la séquence) si i était le dernier élément. La deuxième solution est plus précise à cet égard.

0 votes

Le PO a demandé : "Existe-t-il d'autres moyens sans exceptions ?" - Les exceptions sont lentes et se propagent, donc si use_last(i) soulève UnboundLocalError vous obtiendrez une mauvaise réponse et aucun message d'erreur. Cela dit, hasattr a le même problème, donc je suppose que c'est la réponse la plus "pythique".

0voto

Gulzar Points 620

Également une possibilité pour les objets, utiliser __dict__ .

class A(object):
    def __init__(self):
        self.m = 1

a = A()
assert "m" in a.__dict__
assert "k" not in a.__dict__

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