Je veux vérifier si une variable existe. Maintenant, je fais quelque chose comme ça:
try:
myVar
except NameError:
# Do something.
Y a-t-il d'autres moyens sans exceptions?
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.
L’utilisation de variables qui n’ont pas été définies ou définies (implicitement ou explicitement) est presque toujours une mauvaise chose dans le langage any car elle indique que la logique du programme n’a pas été bien pensée, et est susceptible d'entraîner un comportement imprévisible.
L'astuce suivante, similaire à la vôtre, garantira qu'une variable a une valeur quelques-uns 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 ce soit une bonne idée - à mon avis, vous devriez refactoriser votre code afin que cette situation ne se produise pas.
Un moyen simple consiste à l'initialiser en disant d'abord myVar = None
Puis plus tard:
if myVar is not None:
# Do something
Utiliser try/except est le meilleur moyen de tester l'existence d'une variable. Mais il est presque 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, utilisez un code similaire à ceci:
my_variable = None
def InitMyVariable():
global my_variable
if my_variable is None:
my_variable = ...
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
Je suppose que le test va être utilisé dans une fonction similaire à réponse de l'utilisateur9737 . Je n'aime pas cette réponse car elle pollue l'espace de noms global. Une façon de résoudre ce problème consiste à 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: faut-il que cela confirme le modèle de programmation Singleton? Heureusement, Python a autorisé les fonctions à avoir des attributs pendant un certain temps, ce qui nous donne cette solution simple:
def InitMyVariable():
if InitMyVariable.my_variable is None:
InitMyVariable.my_variable = ...
InitMyVariable.my_variable = None
catch
est appelé except
en Python. à part ça, c'est bien pour des cas aussi simples. Il existe le AttributeError
qui peut être utilisé pour vérifier si un objet a un attribut.
C'est juste un ajout aux réponses précédentes pour vérifier si une clé est présente dans JSON/Dict ou non dans python
'Nom d'objet Json/Dict'. A_key ('nom de clé')
cela retournera vrai ou faux
Une façon qui fonctionne souvent bien pour gérer ce genre de situation est de ne pas vérifier explicitement si la variable existe, mais simplement d'envelopper la première utilisation de la variable éventuellement non existante dans une erreur 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
...