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 ?
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 car elle pollue l'espace de noms global. Une façon d'y remédier 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 cela, car cela complique le code et soulève des questions telles que : doit-on confirmer le modèle de programmation Singleton ? Heureusement, Python permet depuis un certain temps aux fonctions d'avoir des attributs, ce qui nous donne cette solution simple :
def InitMyVariable():
if InitMyVariable.my_variable is None:
InitMyVariable.my_variable = ...
InitMyVariable.my_variable = None
catch
s'appelle except
en Python. En dehors de cela, c'est très bien pour des cas aussi simples. Il y a le AttributeError
qui peut être utilisé pour vérifier si un objet possède un attribut.
Une méthode qui fonctionne souvent bien pour gérer ce genre de situation est de ne pas vérifier explicitement si la variable existe mais de simplement aller de l'avant et d'envelopper la première utilisation de la variable éventuellement inexistante dans un 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
...
Comme ça :
def no(var):
"give var as a string (quote it like 'var')"
assert(var not in vars())
assert(var not in globals())
assert(var not in vars(__builtins__))
import keyword
assert(var not in keyword.kwlist)
Puis plus tard :
no('foo')
foo = ....
Si votre nouvelle variable foo
n'est pas sûr à utiliser, vous obtiendrez une AssertionError
exception qui indiquera la ligne qui a échoué, et vous serez alors mieux informé. Voici l'autoréférence artificielle évidente :
no('no')
---------------------------------------------------------------------------
AssertionError Traceback (most recent call last)
<ipython-input-88-d14ecc6b025a> in <module>
----> 1 no('no')
<ipython-input-86-888a9df72be0> in no(var)
2 "give var as a string (quote it)"
3 assert( var not in vars())
----> 4 assert( var not in globals())
5 assert( var not in vars(__builtins__))
6 import keyword
AssertionError:
Dans python3, la ligne avec __builtins__
devrait être remplacé par : import builtins assert( var not in vars(builtins)) Et ce n'est probablement pas une mauvaise pratique que de terminer la définition avec une balise return True
afin que vous puissiez écrire des choses comme assert no('foo')
ce qui est plus clair.
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.