Python >> Tutoriel Python >  >> Python

Python's NameError :le nom 'xxx' n'est pas défini - Comment réparer ce bogue stupide ?

L'interpréteur Python lance le NameError exception s'il rencontre une variable ou un nom de fonction non défini. Pour résoudre ce problème, vous devez comprendre pourquoi la variable n'est pas définie - les bogues les plus fréquents sont (1) d'utiliser le nom de la variable ou de la fonction dans le code avant il a été défini, ou (2) de mal orthographier le nom dans la définition ou l'utilisation.

Jetez un œil à l'exemple minimal dans notre shell de code interactif :

Exercice :Définir la variable some_variable avant de l'utiliser et de corriger le bogue !

Remarque :Toutes les explications et solutions fournies ci-dessous ont été vérifiées avec Python 3.8.5.

Problème

Quand on commence à écrire du code Python, on rencontre le NameError exception. L'interpréteur Python lève cette exception pour indiquer une erreur. Les codeurs Python expérimentés, même les légendes Python comme Guido (je suppose), rencontrent ces erreurs de temps en temps. Dans sa forme la plus simple, l'erreur ressemble à quelque chose de similaire à ce qui suit :

>>> print(some_variable)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'some_variable' is not defined
>>>

Sortie souhaitée

Cet article vise à aider le lecteur à comprendre certaines des raisons les plus courantes de cette erreur.

>>> print(some_variable)
hello world
>>> 

La sortie souhaitée suppose la variable some_variable , pointe vers la chaîne "hello world" . En d'autres termes, la sortie souhaitée serait une exécution sans erreur du code Python du lecteur.

Contexte

Python est un langage interprété. Cela signifie qu'il interprète n'importe quel code Python, ligne par ligne, du début du code à la fin. L'exécution s'arrête généralement à la première erreur rencontrée par l'interpréteur Python. Le message d'erreur imprime généralement des informations utiles sur le problème. Dans la plupart des cas, le lecteur peut déboguer, déduire et localiser la syntaxe erronée et la corriger. Ce blog tentera de décrire un de ces problèmes courants appelé NameError .

Définition de variable manquante

Une cause courante de NameError l'exception est une définition de variable manquante. Comme mentionné précédemment, Python est un langage interprété. Cela signifie que le lecteur doit définir les variables avant de les utiliser. Considérez le code suivant. Le lecteur est impatient d'essayer du code Python de base très rapidement. Ils lancent donc l'interpréteur Python pour tester leurs nouvelles compétences en Python.

>>> print(some_variable)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'some_variable' is not defined
>>>

Oops!!! Le lecteur découvre qu'il n'a pas défini some_variable , avant de l'utiliser ! Corrigez ce problème comme indiqué ci-dessous. Définir some_variable avant de l'utiliser !

>>> some_variable = ‘Hello World’
>>> print(some_variable)
Hello World
>>> 

Nom de variable mal orthographié

Les noms de variables mal orthographiés peuvent être erronés de la même manière. Considérez l'exemple de code suivant.

>>> som_variable = ‘Hello World’
>>> print(some_variable)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'some_variable' is not defined
>>> 

Remarque :som_variable n'est pas le même que some_variable (c'est-à-dire qu'il manque 'e' )

Définitions de fonctions manquantes

Une autre cause courante de NameError l'exception est une définition de fonction manquante. Comme pour les définitions de variables, le lecteur doit définir toute fonction avant de l'utiliser. Considérez le code suivant.

>>> some_other_string = ‘Hello World’
>>> some_function(some_other_string)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'some_function' is not defined
>>> 

Encore une fois, la fonction 'some_function' n'est pas défini avant son utilisation.
Corrigez ce problème comme indiqué ci-dessous. Définir 'some_function' avant de l'utiliser.

>>> def some_function(some_string):
...     print(some_string)
... 
>>> some_other_string = ‘Hello World’
>>> some_function(some_other_string)
Hello World
>>>

Nom de la fonction mal orthographié

Les noms de fonction mal orthographiés peuvent être erronés de la même manière. Considérez l'exemple de code suivant.

>>> def som_function(some_string):
...     print(some_string)
... 
>>> some_other_string = ‘Hello World’
>>> some_function(some_other_string)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'some_function' is not defined
>>> 

Remarque :'som_function' n'est pas le même que 'some_function' (c'est-à-dire qu'il manque 'e' )

Portée erronée

Encore une autre cause fréquente de NameError l'exception est l'utilisation de la variable dans la mauvaise portée. Prenons l'exemple suivant.

>>> ## Define the function some_function()
>>> def some_function():
...     a_local_variable = ‘I am Local…’
...     print("Printing a Local variable from within a function definition: " + a_local_variable)
... 
>>> ## Call some_function()
>>> some_function()
Printing a Local variable from within a function definition: I am Local...
>>> 
>>> ## Try to print "a_local_variable" from outside the function definition
>>> print("Attempting to print the variable from outside some_function(): " + a_local_variable)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a_local_variable' is not defined
>>> 

L'erreur de nom une exception s'est produite car a_local_variable a été appelé depuis l'extérieur de sa portée de fonction.
Une façon de résoudre ce problème consiste à définir a_local_variable comme une variable globale à la place. Prenons l'exemple suivant.

>>> ## Define a Global Variable
>>> a_global_variable = ‘I am global…’
>>> 
>>> ## Define the function some_function()
>>> def some_function():
...     print("Printing the Global variable from within a function definition: " + a_global_variable)
... 
>>> ## Call some_function()
>>> some_function()
Printing the Global variable from within a function definition: I am global...
>>> 
>>> ## Try to print "a_global_variable" from outside the function definition
>>> print("Attempting to print the Global variable from outside some_function(): " + a_global_variable)
Attempting to print the Global variable from outside some_function(): I am global…
>>> 

Chaîne sans guillemets dans l'instruction print()

Oublier de citer les chaînes dans le print() l'instruction peut provoquer l'NameError exception. Cela n'arrive pas souvent, mais il est bon de savoir que cela peut arriver. Le lecteur est plus susceptible de voir une SyntaxError plutôt qu'une NameError . Considérez les exemples suivants…

>>> print(Hello)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'Hello' is not defined

>>> print(Hello World)
  File "<stdin>", line 1
    print(Hello World)
                ^
SyntaxError: invalid syntax
>>> 

Dans les deux exemples ci-dessus, les chaînes sans guillemets provoquent des erreurs. Erreur de nom dans un cas et SyntaxError en autre.

Dans ce cas, la solution est simple. Placez les chaînes entre guillemets.

>>> print(‘Hello’)
Hello

>>> print(‘Hello World’)
Hello World

Conclusion

De telles erreurs se produiront dans la vie de codage du lecteur. L'important est d'en tirer des leçons et d'avancer. Au fil du temps, le lecteur s'améliorera en codage, car il intègre de bonnes habitudes de codage. De telles erreurs se produisent de moins en moins à mesure que le lecteur acquiert de l'expérience.

Académie Finxter

Ce blog vous a été présenté par Girish , un étudiant de Finxter Academy. Vous pouvez trouver son profil Upwork ici.

Références

Toutes les recherches pour cet article de blog ont été effectuées à l'aide de documents Python, du moteur de recherche Google et de la base de connaissances partagée de la Finxter Academy et des communautés Stack Overflow. Des concepts et des idées ont également été recherchés auprès des communautés de l'Université de Boston et de Career Karma.


Prochain article