Pitón es un lenguaje de programación popular y versátil, pero como cualquier otro lenguaje, puede generar errores cuya depuración puede resultar frustrante. Uno de los errores comunes que encuentran los desarrolladores es el TypeError: el objeto 'NoneType' no es iterable. En este artículo, exploraremos varios escenarios en los que puede ocurrir este error y brindaremos soluciones prácticas para ayudarlo a abordarlo de manera efectiva.
Comprender el error: el objeto NoneType no es iterable
El mensaje de error TypeError: el objeto 'NoneType' no es iterable en Pitón Normalmente ocurre cuando intentas iterar sobre un objeto que tiene un valor de Ninguno . Este error se genera porque Ninguno no es iterable, lo que significa que no puede recorrerlo como lo hace con listas, tuplas u otros objetos iterables.
sintaxis: TypeError: el objeto 'NoneType' no es iterable
Causas de TypeError: el objeto 'NoneType' no es iterable
- Sentencia devuelta faltante
- Respuesta API no válida
- Iterando sobre una variable con el valor Ninguno
- Ninguno Error de tipo en clases
- Funciones Lambda y error Ninguno tipo
Sentencia devuelta faltante
Uno de los escenarios más comunes que conducen a este error es que falta una declaración de retorno en una función. Digamos que tenemos una función que se supone que debe devolver un lista de números, pero nos olvidamos de incluir una declaración de devolución:
Python3
def> generate_numbers():> >numbers>=> [>1>,>2>,>3>,>4>,>5>]> ># Missing return statement> result>=> generate_numbers()> for> num>in> result:> >print>(num)> |
>
>
Producción
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 1 line 6 3 # Missing return statement 5 result = generate_numbers() ---->6 para num en el resultado: 7 print(num) TypeError: el objeto 'NoneType' no es iterable>
En este caso, ' generar_números()' no devuelve nada, lo que significa que no devuelve Ninguno. Cuando intentamos iterar sobre el resultado, nos encontraremos con el mensaje ' Error de tecleado' porque no podemos iterar sobre Ninguno.
Solución: garantizar una devolución adecuada
Para corregir este error, asegúrese de que nuestra función devuelva el valor esperado. En este ejemplo, deberíamos agregar una declaración de devolución a 'generar_números()':
Python3
def> generate_numbers():> >numbers>=> [>1>,>2>,>3>,>4>,>5>]> >return> numbers> result>=> generate_numbers()> for> num>in> result:> >print>(num)> |
tamaños de fuente en látex
>
>
Producción
1 2 3 4 5>
Ahora, generar_números() devuelve una lista de números y el error se resuelve.
Respuesta API no válida
Otro escenario en el que puede encontrar este error es cuando trabaja con API . Digamos que estamos realizando una solicitud API para recuperar datos, pero la API devuelve Ninguno en lugar de los datos esperados:
Python3
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)> |
>
>
Producción
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 2 line 11 8 return None 10 data = fetch_data() --->11 para elemento en datos: 12 print(item) TypeError: 'NoneType' el objeto no es iterable>
Si el API la solicitud falla o devuelve Ninguno, obtendremos un 'Error de tecleado' al intentar iterar sobre datos.
Solución: verifique la respuesta de la API
Para manejar esta situación, debemos verificar la respuesta de la API antes de intentar iterar sobre ella. Aquí hay una versión mejorada del código:
Python3
Ups conceptos en java
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 código de estado no es 200, significa que hubo un problema con el API pedido. En este caso, devolvemos una lista vacía [] como valor de marcador de posición en lugar de Ninguno. Devolver una lista vacía nos permite evitar el 'NingunoTipo' error al intentar iterar sobre los datos de respuesta más adelante en el código.
Iterando sobre una variable con el valor Ninguno
Este escenario es sencillo y común. Ocurre cuando intentamos realizar un bucle (iterar) sobre una variable que tiene el valor Ninguno:
Python3
my_list>=> None> for> item>in> my_list:> >print>(item)> |
>
>
Producción
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 3 line 2 1 my_list = None ---->2 para el elemento en my_list: 3 print(item) TypeError: el objeto 'NoneType' no es iterable>
En este escenario, la variable ' mi lista' está establecido en Ninguno. Cuando el bucle for intenta iterar 'mi lista' , se encuentra con el TypeError: el objeto 'NoneType' no es iterable. Este error se produce porque Ninguno no es un objeto iterable y no podemos recorrerlo.
Solución: garantizar la presencia de Iterable antes del bucle
Para corregir este error, debemos asegurarnos de que 'mi lista' contiene un objeto iterable (como una lista, tupla, etc.) antes de intentar iterar sobre él. Agregar un cheque como si my_list no es Ninguno antes del bucle garantiza que el código dentro del bucle solo se ejecute si mi lista no es Ninguno, impidiendo la 'NingunoTipo' error.
Python3
my_list>=> None> if> my_list>is> not> None>:> >for> item>in> my_list:> >print>(item)> |
>
>
1nf 2nf 3nf
Ninguno Error de tipo en clases
Clases en Pitón también puede encontrarse 'NingunoTipo' errores, especialmente cuando se trabaja con métodos que devuelven Ninguno. Considere una clase con un método que no devuelve ningún valor.
Supongamos que tenemos una clase llamada 'Alumno'. En esta clase, queremos almacenar el nombre de un estudiante y sus calificaciones. La clase tiene un método llamado 'obtener calificaciones()' que, lógicamente, debería devolver las calificaciones del alumno. En esta situación, un estudiante llamado ' Alisha' se crea con una lista de calificaciones. La intención es comprobar si alguna de las calificaciones de Alisha es superior o igual a 90 e imprimirlas.
Aquí está el código inicial:
árbol b+
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)> |
>
>
Producción
--------------------------------------------------------------------------- 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 para la calificación en Student.get_grades(): 14 si la calificación>=90: 15 print(grade) TypeError: el objeto 'NoneType' no es iterable> La cuestión radica en el 'obtener calificaciones()' método. Si bien imprime las calificaciones, no las devuelve. Cuando intentamos recorrer 'estudiante.get_grades()' , imprime las calificaciones pero no le proporciona ningún valor con el que trabajar en el bucle.
Entonces, cuando intentamos iterar sobre el resultado de 'estudiante.get_grades()', regresa implícitamente 'Ninguno' porque no hay una declaración de devolución explícita en el 'obtener calificaciones()' método. Pitón considera esto Ninguno, que no es iterable. Como resultado, nos encontramos con una TypeError: el objeto 'NoneType' no es iterable error.
Solución: devolver valores apropiados de los métodos de clase
Para resolver este problema, necesitamos modificar el 'obtener calificaciones()' método. En lugar de simplemente imprimir las calificaciones, debería devolverlas. Devolver las calificaciones significa proporcionar un iterable (en este caso, la lista de calificaciones) al llamador del método. Al devolver las calificaciones, el método se vuelve iterable y el bucle puede funcionar según lo previsto.
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)> |
>
>
Entonces, en este código corregido, el 'obtener calificaciones()' el método devuelve 'auto.calificación', cual es la lista de calificaciones. Cuando iteramos sobre 'estudiante.get_grades()' , repetiremos la lista de calificaciones y no habrá ninguna 'NingunoTipo' error porque estamos iterando sobre un objeto iterable válido.
Producción
90 92>
Funciones Lambda y error Ninguno tipo
El error TypeError: el objeto 'NoneType' no es iterable puede ocurrir en funciones lambda cuando la función lambda devuelve Ninguno en determinadas situaciones. Esto suele suceder cuando devolvemos Ninguno condicionalmente para valores de entrada específicos. Cuando intentamos iterar sobre el resultado de una función lambda que devuelve Ninguno, encontramos este error.
pruebas y tipos de pruebas
Ejemplo: En este ejemplo, si la entrada X no es mayor que 0 (x>0) , el función lambda devuelve Ninguno. Cuando intentamos iterar sobre el resultado, intentamos iterar sobre Ninguno, lo que provoca que TypeError: el objeto 'NoneType' no es iterable error.
Python3
my_lambda>=> lambda> x: x>*> 2> if> x>>0> else> None> result>=> my_lambda(>->1>)> for> item>in> result:> >print>(item)> |
>
>
Producción
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) c:Userspractice.ipynb Cell 5 line 3 1 my_lambda = lambda x: x * 2 if x>0 más Ninguno 2 resultado = my_lambda(-1) ----> 3 para el elemento en el resultado: 4 print(item) TypeError: 'NoneType' el objeto no es iterable>
Solución: garantizar resultados iterables
Para corregir este error, debemos manejar el caso en el que la función lambda devuelve Ninguno. Una forma de manejarlo es proporcionar un iterable predeterminado (como una lista vacía) en el caso de Ninguno. Aquí está el código corregido:
Python3
my_lambda>=> lambda> x: [x>*> 2>]>if> x>>0> else> []> result>=> my_lambda(>->1>)> for> item>in> result:> >print>(item)> |
>
>
Producción: En este código fijo, el función lambda devuelve una lista que contiene x*2 si 'X' es mayor que 0. Si 'X' no es mayor que 0 (como en el caso de -1), devuelve una lista vacía. Ahora podemos iterar sobre el resultado sin encontrarnos con el 'NingunoTipo' error.