10 tipos de errores comunes de Python y cómo resolverlos

Como programador, es probable que encuentre errores al desarrollar software. Esto puede variar desde errores en su lógica que conducen a resultados inesperados, errores que surgen de la violación de las reglas de un lenguaje de programación, hasta errores que surgen mientras ejecuta su programa, entre muchos otros. Estos errores se conocen comúnmente como bugs.

Los errores son omnipresentes en todos los lenguajes de programación, independientemente de lo fácil que sea aprender o usar el lenguaje.

En Python, por ejemplo, aunque el lenguaje enfatiza la legibilidad, sigue una sintaxis expresiva y se considera relativamente fácil de aprender y usar en comparación con otros lenguajes de programación, aún no es inmune a los errores de programación cuando usa Python.

Dado que es probable que surjan errores, una buena manera de lidiar con ellos es aprender sobre los diferentes tipos de errores que pueden ocurrir y cómo ocurren. Esto le permite evitar o minimizar estos errores durante la programación y también saber cómo manejarlos cuando surgen.

Estos son algunos de los errores comunes de Python que puede encontrar al programar usando el lenguaje:

Errores de sintaxis

Un error de sintaxis es un error que surge cuando escribe código que viola las reglas del lenguaje de programación que está utilizando. Esto da como resultado una línea de código no válida.

En Python, por ejemplo, al imprimir una cadena, debe colocarse entre comillas. Si no lo hace, se producirá un error de sintaxis.

También puede surgir un error de sintaxis cuando no abre o cierra paréntesis, corchetes o llaves, escribe mal las palabras clave o los nombres de las funciones, omite los dos puntos al final de las instrucciones de control de flujo o cuando omite los operadores obligatorios en las expresiones.

En general, surgirán errores de sintaxis si viola una regla sobre cómo se debe escribir el código de Python.

## syntax error arising from missing quotation mark
## around the string being printed
print("Hello World)

age = 20
## Syntax error arising from missing colon in an if statement
if age > 18
    print("Age is over 18")

## Syntax error because '(' was never closed
def square(x:
    return x * x
print(square(4))

Al ejecutar el código anterior, se encontrará con un mensaje de error como se muestra a continuación:

El mensaje de error al ejecutar el código es el siguiente:

  File "/home/madici/Desktop/helloworld.py", line 1
    print("Hello World)
          ^
SyntaxError: unterminated string literal (detected at line 1)

Para resolver estos errores, use la sintaxis correcta de Python como se muestra a continuación:

print("Hello World")

age = 20
if age > 18:
    print("Age is over 18")

def square(x):
    return x * x
print(square(4))

Error de sangría

A diferencia de otros lenguajes como Java, C o C++, que usan llaves para separar bloques de código, Python usa sangría para definir la jerarquía y la estructura de los bloques de código. Por ejemplo, al escribir declaraciones de control en Java, todo el código que se ejecutará una vez que se haya evaluado la condición se incluye entre llaves.

En Python, sin embargo, el bloque de código estará sangrado. Una sangría típica en Python consta de cuatro espacios o una pestaña. Sin embargo, la cantidad de espacios no importa siempre que se mantenga constante a lo largo del código que se está escribiendo.

Como programador de Python, es probable que encuentre errores de sangría cuando no agrega la sangría requerida, como cuando escribe declaraciones de control o funciones, cuando usa tabulaciones y espacios para crear sangrías, ya que confunde al intérprete, cuando coloca sangrías en el lugar equivocado o cuando sus sangrías no son consistentes a lo largo de su base de código.

A continuación se muestra un ejemplo de código que da como resultado un error de sangría:

age = 20
if age > 18:
print("Age is greater than 18")
   print("You're allowed to drive")
else:
    print("Age is less than 18")

Los mensajes de error resultantes del código anterior se muestran a continuación:

El mensaje de error al ejecutar el código es el siguiente:

  File "/home/madici/Desktop/helloworld.py", line 3
    print("Age is greater than 18")
    ^
IndentationError: expected an indented block after 'if' statement on line 2

Para corregir los errores, aplique sangría a la línea después de la instrucción if, ya que se requiere una sangría y asegúrese de que coincida con la sangría en el resto del código, como se muestra a continuación:

age = 20
if age > 18:
   print("Age is greater than 18")
   print("You're allowed to drive")
else:
   print("Age is less than 18")

Error de tecleado

En Python, un TypeError es una excepción que surge cuando intenta realizar una operación utilizando un tipo de datos incompatible. Por ejemplo, si intenta agregar una cadena y un entero o concatenar un tipo de datos de cadena con un entero, encontrará un TypeError.

También puede encontrar TypeErrors cuando usa funciones o métodos con tipos de datos incorrectos, cuando intenta usar un índice no entero para acceder a elementos en un iterable como una lista, o cuando intenta iterar a través de un objeto que no puede ser iterable.

En general, cualquier operación que utilice un tipo de datos incorrecto dará lugar a un TypeError.

A continuación se muestran ejemplos de operaciones que pueden conducir a TypeErrors:

# Type Error resulting from concatenating a string an an integer
age = 25
message = "I am " + age + " years old."


list1 = [1, "hello", 5, "world", 18, 2021]
#Type errors resulting from wrong usage of builtin in methods
print(sum(list1))

#TypeError resulting from adding a string and an integer
num1 = 10
num2 = "16"
print(num1 + num2)

#TypeError resulting from using a non integer index
list2 = ["hello", "from", "the", "other", "side"]
print(list2["1"])

Los mensajes de error resultantes del código que se muestra arriba se muestran a continuación:

A continuación se muestra un mensaje TypeError de muestra del código:

  File "/home/madici/Desktop/helloworld.py", line 3, in <module>
    message = "I am " + age + " years old."
              ~~~~~~~~^~~~~
TypeError: can only concatenate str (not "int") to str

Para eliminar los errores, use los tipos de datos correctos o escriba conversiones como se muestra a continuación:

age = 25
message = "I am " + str(age) + " years old."

list1 = [1, 5, 18, 2021]
print(sum(list1))

num1 = 10
num2 = "16"
print(num1 + int(num2))

list2 = ["hello", "from", "the", "other", "side"]
print(list2[1])

Error de atributo

En Python, se produce un AttributeError cuando intenta utilizar un atributo que no existe en el objeto o llama a un método que no existe en el objeto al que se llama. Un AttributeError muestra que un objeto no tiene un atributo o método al que se está llamando.

Por ejemplo, si llama a un método de cadena en un número entero, encontrará un AttributeError porque el método no existe en el tipo de objeto al que lo está llamando.

En el ejemplo que se muestra a continuación, el método capitalize(), que se usa para convertir la primera letra de una cadena a mayúsculas, se llama en un número entero. El resultado es un error de atributo porque int no tiene el método capitalize().

# AttributeError arising from calling capitalize() on an int value
num = 1445
cap = num.capitalize()
print(cap)

Ejecutar este código da como resultado el mensaje de error que se muestra a continuación:

El mensaje AttributeError del código es el siguiente:

  File "/home/madici/Desktop/helloworld.py", line 3, in <module>
    cap = num.capitalize()
          ^^^^^^^^^^^^^^
AttributeError: 'int' object has no attribute 'capitalize'

Para resolver un AttributeError, asegúrese de que el método o atributo al que está llamando exista en el tipo de objeto al que lo está llamando. En este caso, llamar a capitalize() en un tipo de datos de cadena resuelve este error como se muestra a continuación:

ImportError

ImportError en Python ocurre cuando intenta importar un módulo que no se puede encontrar o no es accesible en su entorno actual. Puede ser que aún no esté instalado, no hayas configurado correctamente su ruta o hayas escrito mal el módulo que estás intentando instalar.

Un ImportError tiene una sola subclase secundaria llamada ModuleNotFoundError, que es el error que se genera cuando intenta importar un módulo que no se puede encontrar.

Por ejemplo, el siguiente código intenta importar la biblioteca de análisis de datos pandas y arroja un error de este tipo porque el módulo aún no está instalado.

El mensaje ImportError generado se muestra a continuación:

  File "/home/madici/Desktop/helloworld.py", line 1, in <module>
    import pandas
ModuleNotFoundError: No module named 'pandas'

Para solucionar este error, asegúrese de que se hayan instalado los módulos que está intentando importar. En caso de que eso no resuelva el error, verifique si está usando la ortografía correcta para el módulo y la ruta de archivo correcta para acceder al módulo.

ValorError

Esta es una excepción que ocurre cuando una función en Python recibe un valor del tipo de datos correcto pero el valor es un valor inapropiado. Por ejemplo, la función Math.sqrt() utilizada para encontrar la raíz cuadrada de los valores numéricos devolverá un ValueError si pasa un número negativo.

Por mucho que el valor sea del tipo correcto, es decir un valor numérico, ser negativo lo convierte en un valor inadecuado para el

La función int() que convierte un número o una cadena devolverá un ValueError si pasa una cadena que no es un valor de cadena numérico. Pasar «123» o «45» a la función no devuelve ningún error ya que las cadenas se pueden convertir al valor entero apropiado.

Sin embargo, si pasa una cadena que no es un valor de cadena numérico como «Hola», devuelve un ValueError. Esto se debe a que «Hola», aunque es una cadena, es inapropiado ya que no tiene un equivalente entero.

A continuación se muestra un ejemplo de código que genera un ValueError:

# Value error resulting from inappropriate int value in sqrt()
import math
num = -64
root = math.sqrt(num)
print(root)

# Value error resulting from passing a string with no integer
# equivalent into int() function
numString = "Hello"
num = int(numString)
print(num)

Los errores del código anterior se muestran a continuación:

El mensaje de error generado es el siguiente:

  File "/home/madici/Desktop/helloworld.py", line 4, in <module>
    root = math.sqrt(num)
           ^^^^^^^^^^^^^^
ValueError: math domain error

Para corregir el error, use valores apropiados en las funciones como se muestra a continuación:

import math
num = 64
root = math.sqrt(num)
print(root)

numString = "5231"
num = int(numString)
print(num)

IOError

El IOError (Error de entrada/salida) es una excepción que ocurre cuando falla una operación de entrada o salida. Esto puede deberse al intentar acceder a un archivo que no existe, al almacenamiento en disco insuficiente en su dispositivo, al intentar acceder a un archivo para el que no tiene suficientes permisos o cuando intenta acceder a un archivo que se está utilizando actualmente. por otras operaciones.

Los métodos como open(), read(), write() y close() que se utilizan normalmente cuando se trabaja con archivos son los que probablemente causen dicho error.

Considere el siguiente código que intenta abrir un archivo llamado «notes.txt» que no existe. El código da como resultado un IOError que genera el FileNotFoundError:

Con el siguiente mensaje de error:

  File "/home/madici/Desktop/helloworld.py", line 2, in <module>
    file1 = open("notes.txt", "r")
            ^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: 'notes.txt'

Para evitar el error anterior, todo lo que necesita hacer es asegurarse de que el archivo «notes.txt» exista en el directorio en el que ejecuta el terminal. Otra forma de manejar los IOErrors es usar el bloque try except, como se muestra a continuación:

Error de nombre

NameError es una excepción que encontrará cuando intente usar una variable, función o módulo que no existe, no está definido en el ámbito actual o no se le ha asignado un valor.

Tal error generalmente ocurre cuando escribe mal los nombres de las variables o funciones o los usa antes de que se definan. El uso de un módulo sin importarlo también dará como resultado un NameError.

El siguiente código dará como resultado una excepción NameError:

# name error arises because the math module has not been imported
num = 64
root = math.sqrt(64)
print(root)

# NameError arises because x is used before it is defined
y = 23
print(x)

#NameEror because function name is not defined
def greet():
    print("Good morning")
great() #ameError: name 'great' is not defined

Los siguientes mensajes de error resultan del código anterior:

A continuación se muestra un mensaje de NameError de muestra:

  File "/home/madici/Desktop/helloworld.py", line 3, in <module>
    root = math.sqrt(64)
           ^^^^
NameError: name 'math' is not defined

Para resolver tal NameError, asegúrese de no estar usando módulos antes de importarlos, no está usando variables o funciones antes de definirlas, y no está escribiendo mal los nombres de funciones o variables:

import math
num = 64
root = math.sqrt(64)
print(root)

y = 23
print(y)

def greet():
    print("Good morning")
greet()

IndexError

Un IndexError es una excepción que ocurre cuando intenta acceder a un índice en una lista o tupla que está fuera de rango. Considere la siguiente lista:

list1 = [1, 2, 3, 4, 5]

La lista tiene cinco elementos. Python cuenta índices desde 0 (cero). Por lo tanto, la lista anterior tiene índices que van de 0 a n-1, siendo n el número o los elementos de la lista. En este caso, el índice o la lista tendrá un rango de 0 a 4.

Si intenta acceder a un elemento en un índice superior a 4, se encontrará con un IndexError porque el índice está fuera de rango en la lista desde la que intenta acceder a un elemento. El siguiente código genera un IndexError:

list1 = [1, 2, 3, 4, 5]
item = list1[6] #IndexError because the list index is out of range
print(item)

El error del código se muestra a continuación:

El mensaje IndexError generado es el siguiente:

  File "/home/madici/Desktop/helloworld.py", line 2, in <module>
    item = list1[6] #IndexError because the list index is out of range
           ~~~~~^^^
IndexError: list index out of range

La mejor manera de evitar un IndexError es utilizar las funciones range() y len() para asegurarse de que solo está accediendo a los elementos que están dentro del rango de esta manera:

list1 = [1, 2, 3, 4, 5]

for i in range(len(list1)):
    print(list1[i])

Error de clave

Un KeyError es una excepción que ocurre cuando intenta acceder a un elemento de un diccionario usando una clave y la clave no se encuentra en el diccionario. Considere el siguiente diccionario:

cities = {"Canada": "Ottawa", "USA": "Washington", "Italy": "Rome"}

Las claves en el diccionario son «Canadá», «EE.UU.», «Italia». Puede acceder a los elementos del diccionario de ciudades utilizando las tres teclas. Sin embargo, si intenta acceder a un elemento utilizando una clave que no existe, como «Brasil», se encontrará con un KeyError, como se muestra a continuación:

El mensaje KeyError generado se muestra a continuación:

  File "/home/madici/Desktop/helloworld.py", line 6, in <module>
    print(cities["Brazil"])
          ~~~~~~^^^^^^^^^^
KeyError: 'Brazil'

Para resolver un KeyError, asegúrese de que las claves que está utilizando para acceder a los elementos de un diccionario estén realmente presentes en el diccionario. Para hacer esto, puede usar una declaración if…else como esta:

cities = {"Canada": "Ottawa", "USA": "Washington", "Italy": "Rome"}

country = "Canada"

if country in cities:
    print("The capital city of " + country + " is " + cities[country])
else:
	print("The key " + country + " is not present in the cities dictionary")

De esta manera, evitará encontrarse con KeyErrors al acceder a elementos de un diccionario.

Conclusión

Al codificar en Python, independientemente de su nivel de experiencia, es probable que encuentre errores. Por lo tanto, asegúrese de familiarizarse con los diferentes tipos de errores destacados en el artículo para asegurarse de poder manejarlos cuando surjan.

También puede explorar algunas frases útiles de Python para simplificar las tareas comunes.