Python est un langage de programmation populaire et polyvalent, mais comme tout autre langage, il peut générer des erreurs qui peuvent être frustrantes à déboguer. L'une des erreurs courantes rencontrées par les développeurs est la TypeError : l'objet 'NoneType' n'est pas itérable. Dans cet article, nous explorerons différents scénarios dans lesquels cette erreur peut se produire et proposerons des solutions pratiques pour vous aider à y remédier efficacement.
Comprendre l'erreur : l'objet NoneType n'est pas itérable
Le message d'erreur TypeError : l'objet 'NoneType' n'est pas itérable dans Python se produit généralement lorsque vous essayez de parcourir un objet qui a une valeur de Aucun . Cette erreur est générée car None n'est pas itérable, ce qui signifie que vous ne pouvez pas le parcourir comme vous le pouvez avec des listes, des tuples ou d'autres objets itérables.
syntaxe : TypeError : l'objet 'NoneType' n'est pas itérable
Causes de TypeError : l'objet 'NoneType' n'est pas itérable
- Déclaration de retour manquante
- Réponse API invalide
- Itérer sur une variable avec la valeur Aucun
- Aucun Erreur de type dans les classes
- Fonctions Lambda et erreur NoneType
Déclaration de retour manquante
L'un des scénarios les plus courants conduisant à cette erreur est une instruction return manquante dans une fonction. Disons que nous avons une fonction censée renvoyer un liste de nombres, mais nous oublions d'inclure une instruction return :
Python3
def> generate_numbers():> >numbers>=> [>1>,>2>,>3>,>4>,>5>]> ># Missing return statement> result>=> generate_numbers()> for> num>in> result:> >print>(num)> |
>
>
Sortir
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 1 line 6 3 # Missing return statement 5 result = generate_numbers() ---->6 pour num dans le résultat : 7 print(num) TypeError : l'objet 'NoneType' n'est pas itérable>
Dans ce cas, ' générer_numéros()' ne renvoie rien, ce qui signifie qu'il renvoie None. Lorsque nous essayons de parcourir le résultat, nous rencontrerons le « Erreur-type' parce que nous ne pouvons pas parcourir None.
Solution : assurer un retour correct
Pour corriger cette erreur, assurez-vous que notre fonction renvoie la valeur attendue. Dans cet exemple, nous devrions ajouter une instruction return à 'generate_numbers()' :
Python3
def> generate_numbers():> >numbers>=> [>1>,>2>,>3>,>4>,>5>]> >return> numbers> result>=> generate_numbers()> for> num>in> result:> >print>(num)> |
>
>
Sortir
1 2 3 4 5>
Maintenant, générer_numéros() renvoie une liste de nombres et l'erreur est résolue.
Réponse API invalide
Un autre scénario dans lequel vous pourriez rencontrer cette erreur est lorsque vous travaillez avec Apis . Disons que nous faisons une requête API pour récupérer des données, mais que l'API renvoie None au lieu des données attendues :
Python3
mysql créer un utilisateur
import> requests> def> fetch_data():> >response>=> requests.get(>' https://api.openweathermap.org/data '>)> >if> response.status_code>=>=> 200>:> >return> response.json()> >else>:> >return> None> data>=> fetch_data()> for> item>in> data:> >print>(item)> |
>
>
Sortir
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 2 line 11 8 return None 10 data = fetch_data() --->11 pour l'élément dans les données : 12 print(item) TypeError : l'objet 'NoneType' n'est pas itérable>
Si la API la demande échoue ou renvoie Aucun, nous obtiendrons un 'Erreur-type' lorsque vous essayez de parcourir les données.
Solution : vérifier la réponse de l'API
Pour gérer cette situation, nous devons vérifier la réponse de l'API avant d'essayer de la parcourir. Voici une version améliorée du code :
Python3
import> requests> def> fetch_data():> >response>=> requests.get(>' https://api.openweathermap.org/data '>)> >if> response.status_code>=>=> 200>:> >return> response.json()> >else>:> >return> [ ]> data>=> fetch_data()> for> item>in> data:> >print>(item)> |
>
>
Si le code d'état n'est pas 200, cela signifie qu'il y a eu un problème avec le API demande. Dans ce cas, nous renvoyons une liste vide [] comme valeur d'espace réservé au lieu de None. Renvoyer une liste vide nous permet d'éviter le 'AucunType' erreur lors de la tentative de parcourir les données de réponse plus tard dans le code.
Itérer sur une variable avec la valeur Aucun
Ce scénario est simple et courant. Cela se produit lorsque nous essayons de boucler (itérer) sur une variable qui a la valeur None :
Python3
my_list>=> None> for> item>in> my_list:> >print>(item)> |
>
>
Sortir
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 3 line 2 1 my_list = None ---->2 pour l'élément dans ma_liste : 3 print(item) TypeError : l'objet 'NoneType' n'est pas itérable>
Dans ce scénario, la variable ' ma liste' est défini sur Aucun. Lorsque la boucle for tente de parcourir 'ma liste' , il rencontre le TypeError : l'objet 'NoneType' n'est pas itérable. Cette erreur se produit car None n’est pas un objet itérable et nous ne pouvons pas le parcourir.
Solution : assurer la présence d'Iterable avant de boucler
Pour corriger cette erreur, nous devons nous assurer que 'ma liste' contient un objet itérable (tel qu'une liste, un tuple, etc.) avant de tenter de le parcourir. Ajout d'un chèque comme si ma_liste n'est pas Aucune avant la boucle garantit que le code à l'intérieur de la boucle ne s'exécute que si ma liste n'est pas Aucun, ce qui empêche le 'AucunType' erreur.
Python3
my_list>=> None> if> my_list>is> not> None>:> >for> item>in> my_list:> >print>(item)> |
Alisa Manyonok
>
>
Aucun Erreur de type dans les classes
Des classes dans Python peut également rencontrer 'AucunType' erreurs, en particulier lorsque vous travaillez avec des méthodes qui renvoient None. Considérons une classe avec une méthode qui ne renvoie aucune valeur.
Supposons que nous ayons une classe nommée 'Étudiant'. Dans cette classe, nous souhaitons stocker le nom d’un élève et ses notes. La classe a une méthode appelée 'get_grades()' ce qui, logiquement, devrait restituer les notes de l’élève. Dans cette situation, un étudiant nommé « Alisha' est créé avec une liste de notes. L'intention est de vérifier si l'une des notes d'Alisha est supérieure ou égale à 90 et de les imprimer.
Voici le code initial :
Python3
class> Student:> >def> __init__(>self>, name,grade):> >self>.name>=> name> >self>.grade>=> grade> > >def> get_grades(>self>):> > >print>(>self>.grade)> > > student>=> Student(>'Alisha'>,[>90>,>85>,>88>,>92>])> for> grade>in> student.get_grades():> >if> grade>>=>90>:> >print>(grade)> |
>
>
Sortir
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 4 line 13 8 print(self.grade) 11 student = Student('Alisha',[90,85,88,92]) --->13 pour la note dans student.get_grades() : 14 si note>=90 : 15 print(grade) TypeError : l'objet 'NoneType' n'est pas itérable> Le problème réside dans le 'get_grades()' méthode. Même s’il imprime les notes, il ne les renvoie pas. Quand nous essayons de parcourir 'étudiant.get_grades()' , il imprime les notes mais ne vous donne aucune valeur avec laquelle travailler dans la boucle.
Ainsi, lorsque nous essayons de parcourir le résultat de 'étudiant.get_grades()', il renvoie implicitement 'Aucun' car il n'y a pas d'instruction return explicite dans le 'get_grades()' méthode. Python considère ceci None, qui n'est pas itérable. En conséquence, nous rencontrons un TypeError : l'objet 'NoneType' n'est pas itérable erreur.
Solution : renvoyer les valeurs appropriées à partir des méthodes de classe
Pour résoudre ce problème, nous devons modifier le 'get_grades()' méthode. Au lieu de simplement imprimer les notes, il devrait les renvoyer. Renvoyer les notes signifie fournir un itérable (dans ce cas, la liste des notes) à l'appelant de la méthode. En renvoyant les notes, la méthode devient itérable et la boucle peut fonctionner comme prévu.
Python3
class> Student:> >def> __init__(>self>, name,grade):> >self>.name>=> name> >self>.grade>=> grade> > >def> get_grades(>self>):> > >return> self>.grade> > > student>=> Student(>'Alisha'>,[>90>,>85>,>88>,>92>])> for> grade>in> student.get_grades():> >if> grade>>=>90>:> >print>(grade)> |
>
>
Donc dans ce code corrigé, le 'get_grades()' la méthode renvoie « auto.grade », qui est la liste des notes. Quand nous parcourons 'étudiant.get_grades()' , nous allons parcourir la liste des notes, et il n'y en aura pas 'AucunType' erreur car nous parcourons un objet itérable valide.
Sortir
90 92>
Fonctions Lambda et erreur NoneType
L'erreur TypeError : l'objet 'NoneType' n'est pas itérable peut se produire dans fonctions lambda lorsque la fonction lambda renvoie None dans certaines situations. Cela se produit généralement lorsque nous renvoyons conditionnellement None pour des valeurs d'entrée spécifiques. Lorsque nous essayons de parcourir le résultat d'une fonction lambda qui renvoie None, nous rencontrons cette erreur.
Exemple: Dans cet exemple, si l'entrée X n'est pas supérieur à 0 (x>0) , le fonction lambda renvoie Aucun. Lorsque nous essayons de parcourir le résultat, nous essayons de parcourir Aucun, ce qui provoque le TypeError : l'objet 'NoneType' n'est pas itérable erreur.
Python3
my_lambda>=> lambda> x: x>*> 2> if> x>>0> else> None> result>=> my_lambda(>->1>)> for> item>in> result:> >print>(item)> |
>
>
Sortir
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 5 line 3 1 my_lambda = lambda x: x * 2 if x>0 sinon Aucun 2 résultat = my_lambda(-1) ----> 3 pour l'élément dans le résultat : 4 print(item) TypeError : l'objet 'NoneType' n'est pas itérable>
Solution : garantir des résultats itérables
Pour corriger cette erreur, nous devons gérer le cas où la fonction lambda renvoie None. Une façon de gérer cela consiste à fournir un itérable par défaut (comme une liste vide) dans le cas de Aucun. Voici le code corrigé :
Python3
my_lambda>=> lambda> x: [x>*> 2>]>if> x>>0> else> []> result>=> my_lambda(>->1>)> for> item>in> result:> >print>(item)> |
>
>
Sortir: Dans ce code fixe, le fonction lambda renvoie une liste contenant x * 2 si 'X' est supérieur à 0. Si 'X' n'est pas supérieur à 0 (comme dans le cas de -1), il renvoie une liste vide. Maintenant, nous pouvons parcourir le résultat sans rencontrer le 'AucunType' erreur.