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 ?
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 ?
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')
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.
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.
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".
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.
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 letry
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.1 votes
Une réponse plus complète : stackoverflow.com/a/1592578/1661797
1 votes
Gardez à l'esprit que les exceptions en tant que telles sont très bon marché en python, par rapport à java par exemple, et sont presque encouragées / pythoniques.