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 ?
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
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.
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".
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.
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'
Pourquoi pas quelque chose comme : if myVar: # Do something
Cela évite de devoir lire un double négatif.
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 = ...
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 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.