Python és un llenguatge de programació popular i versàtil, però com qualsevol altre llenguatge, pot generar errors que poden ser frustrants de depurar. Un dels errors habituals que es troben els desenvolupadors és el TypeError: l'objecte 'NoneType' no és iterable. En aquest article, explorarem diversos escenaris on es pot produir aquest error i oferirem solucions pràctiques que us ajudin a abordar-lo de manera eficaç.
Entendre l'error: l'objecte NoneType no és iterable
El missatge d'error TypeError: l'objecte 'NoneType' no és iterable en Python normalment es produeix quan intenteu iterar sobre un objecte que té un valor de Cap . Aquest error es produeix perquè None no és iterable, és a dir, no podeu fer un bucle a través d'ell com ho podeu fer amb llistes, tuples o altres objectes iterables.
sintaxi: TypeError: l'objecte 'NoneType' no és iterable
Causes de TypeError: l'objecte 'NoneType' no és iterable
- Falta declaració de devolució
- Resposta de l'API no vàlida
- Iteració sobre una variable amb el valor Cap
- Cap Error de tipus a les classes
- Funcions Lambda i error NoneType
Falta declaració de devolució
Un dels escenaris més habituals que condueixen a aquest error és una declaració de retorn que falta en una funció. Suposem que tenim una funció que se suposa que retorna a llista de números, però ens oblidem d'incloure una declaració de retorn:
Python 3
núvol de primavera
def> generate_numbers():> >numbers>=> [>1>,>2>,>3>,>4>,>5>]> ># Missing return statement> result>=> generate_numbers()> for> num>in> result:> >print>(num)> |
>
>
Sortida
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 1 line 6 3 # Missing return statement 5 result = generate_numbers() ---->6 per num al resultat: 7 print(num) TypeError: L'objecte 'NoneType' no és iterable>
En aquest cas, ' genera_números()' no retorna res, el que significa que no retorna Cap. Quan intentem repetir el resultat, ens trobarem amb el ' TypeError' perquè no podem repetir cap.
Solució: Assegureu-vos la devolució correcta
Per corregir aquest error, assegureu-vos que la nostra funció retorni el valor esperat. En aquest exemple, hauríem d'afegir una instrucció return a 'generar_numbers()':
Python 3
def> generate_numbers():> >numbers>=> [>1>,>2>,>3>,>4>,>5>]> >return> numbers> result>=> generate_numbers()> for> num>in> result:> >print>(num)> |
>
>
Sortida
1 2 3 4 5>
Ara, genera_números() retorna una llista de números i l'error es resol.
Resposta de l'API no vàlida
Un altre escenari on es pot trobar aquest error és quan es treballa API . Suposem que estem fent una sol·licitud d'API per obtenir dades, però l'API retorna Cap en comptes de les dades esperades:
Python 3
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)> |
>
>
Sortida
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 2 line 11 8 return None 10 data = fetch_data() --->11 per a l'element a les dades: 12 print(item) TypeError: L'objecte 'NoneType' no és iterable>
Si el API la sol·licitud falla o retorna Cap, obtindrem un 'TypeError' quan intenteu iterar sobre dades.
Solució: comproveu la resposta de l'API
Per gestionar aquesta situació, hauríem de comprovar la resposta de l'API abans d'intentar-hi iterar. Aquí teniu una versió millorada del codi:
Python 3
ratolí i tipus de ratolí
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 el codi d'estat no és 200, vol dir que hi ha hagut un problema amb el API petició. En aquest cas, retornem una llista buida [] com a valor de marcador de posició en lloc de Cap. Tornar una llista buida ens permet evitar el 'Cap tipus' error en intentar iterar les dades de resposta més endavant al codi.
Iteració sobre una variable amb el valor Cap
Aquest escenari és senzill i comú. Es produeix quan intentem fer un bucle (iterar) sobre una variable que té el valor Cap:
Python 3
my_list>=> None> for> item>in> my_list:> >print>(item)> |
>
>
Sortida
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 3 line 2 1 my_list = None ---->2 per a l'element de la meva_llista: 3 print(element) TypeError: L'objecte 'NoneType' no és iterable>
En aquest escenari, la variable ' la meva_llista' està establert en Cap. Quan el bucle for intenta repetir 'la meva_llista' , es troba amb el TypeError: l'objecte 'NoneType' no és iterable. Aquest error es produeix perquè None no és un objecte iterable i no podem recórrer-lo.
Solució: assegurant la presència iterable abans del bucle
Per corregir aquest error, ens hem de garantir 'la meva_llista' conté un objecte iterable (com una llista, una tupla, etc.) abans d'intentar iterar-hi. Afegint un xec com si la meva_lista no és Cap abans del bucle assegura que el codi dins del bucle només s'executa si la meva_llista no és Cap, impedint el 'Cap tipus' error.
Python 3
eina de retall a ubuntu
my_list>=> None> if> my_list>is> not> None>:> >for> item>in> my_list:> >print>(item)> |
>
>
Cap Error de tipus a les classes
Classes en Python també es pot trobar 'Cap tipus' errors, especialment quan es treballa amb mètodes que retornen Cap. Penseu en una classe amb un mètode que no retorna cap valor.
Suposem que tenim una classe anomenada 'Estudiant'. En aquesta classe, volem emmagatzemar el nom d'un alumne i les seves qualificacions. La classe té un mètode anomenat 'obtenir_qualificacions()' que, lògicament, hauria de retornar les notes de l'alumne. En aquesta situació, un estudiant anomenat ' Alisha' es crea amb una llista de qualificacions. La intenció és comprovar si alguna de les notes d'Alisha és superior o igual a 90 i imprimir-les
Aquí teniu el codi inicial:
Python 3
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)> |
>
java si més
>
Sortida
--------------------------------------------------------------------------- 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 per a la nota a student.get_grades(): 14 si qualifica>=90: 15 print(qualificació) TypeError: L'objecte 'NoneType' no és iterable>>> La qüestió rau en el 'obtenir_qualificacions()' mètode. Tot i que imprimeix les qualificacions, no les retorna. Quan intentem fer un bucle 'student.get_grades()' , imprimeix les qualificacions però no us dóna cap valor per treballar al bucle.
Així, quan intentem iterar sobre el resultat de 'student.get_grades()', torna implícitament 'Cap' perquè no hi ha cap declaració de retorn explícita al fitxer 'obtenir_qualificacions()' mètode. Python considera això Cap, que no és iterable. Com a resultat, ens trobem amb un TypeError: l'objecte 'NoneType' no és iterable error.
Solució: retornant els valors adequats dels mètodes de classe
Per resoldre aquest problema, hem de modificar el fitxer 'obtenir_qualificacions()' mètode. En lloc d'imprimir només les qualificacions, hauria de retornar-les. Tornar les qualificacions significa proporcionar un iterable (en aquest cas, la llista de qualificacions) a l'autor del mètode. En retornar les qualificacions, el mètode es fa iterable i el bucle pot funcionar com es pretén.
Python 3
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)> |
>
Així, en aquest codi corregit, el 'obtenir_qualificacions()' retorna el mètode 'autocalificació', que és la llista de notes. Quan repetim 'student.get_grades()' , repetirem la llista de notes i no n'hi haurà 'Cap tipus' error perquè estem iterant sobre un objecte iterable vàlid.
Sortida
90 92>
Funcions Lambda i error NoneType
L'error TypeError: l'objecte 'NoneType' no és iterable pot ocórrer en funcions lambda quan la funció lambda retorna Cap en determinades situacions. Això sol passar quan tornem condicionalment Cap per a valors d'entrada específics. Quan intentem iterar sobre el resultat d'una funció lambda que retorna Cap, ens trobem amb aquest error.
fmoviez
Exemple: En aquest exemple, si l'entrada x no és superior a 0 (x>0) , el funció lambda retorna Cap. Quan intentem iterar sobre el resultat, estem intentant iterar sobre Cap, provocant el TypeError: l'objecte 'NoneType' no és iterable error.
Python 3
my_lambda>=> lambda> x: x>*> 2> if> x>>0> else> None> result>=> my_lambda(>->1>)> for> item>in> result:> >print>(item)> |
>
>
Sortida
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 5 line 3 1 my_lambda = lambda x: x * 2 if x>0 else Cap 2 resultat = my_lambda(-1) ----> 3 per a l'element al resultat: 4 print(item) TypeError: 'NoneType' object is not iterable>
Solució: assegurant resultats iterables
Per corregir aquest error, hauríem de gestionar el cas en què la funció lambda retorna Cap. Una manera de gestionar-ho és proporcionar un iterable predeterminat (com ara una llista buida) en el cas de Cap. Aquí teniu el codi corregit:
Python 3
my_lambda>=> lambda> x: [x>*> 2>]>if> x>>0> else> []> result>=> my_lambda(>->1>)> for> item>in> result:> >print>(item)> |
>
>
Sortida: En aquest codi fix, el funció lambda retorna una llista que conté x * 2 si 'x' és superior a 0. Si 'x' no és més gran que 0 (com en el cas de -1), retorna una llista buida. Ara, podem iterar sobre el resultat sense trobar-nos 'Cap tipus' error.