10 tipi comuni di errore Python e come risolverli

Come programmatore, sei destinato a incontrare errori durante lo sviluppo del software. Ciò potrebbe variare da errori nella logica che portano a risultati imprevisti, errori derivanti dalla violazione delle regole di un linguaggio di programmazione, fino a errori che si verificano durante l’esecuzione del programma, tra molti altri. Questi errori sono comunemente indicati come bug.

I bug sono onnipresenti in ogni linguaggio di programmazione, indipendentemente da quanto sia facile imparare o usare il linguaggio.

In Python, ad esempio, sebbene il linguaggio enfatizzi la leggibilità, segua una sintassi espressiva e sia considerato relativamente facile da imparare e usare rispetto ad altri linguaggi di programmazione, non sei ancora immune da errori di programmazione quando usi Python.

Poiché gli errori sono destinati a verificarsi, un buon modo per affrontarli è conoscere i diversi tipi di errori che possono verificarsi e come si verificano. Ciò consente di evitare o ridurre al minimo questi errori durante la programmazione e di sapere anche come gestirli quando si presentano.

Ecco alcuni degli errori Python comuni che potresti riscontrare durante la programmazione utilizzando il linguaggio:

Errori di sintassi

Un errore di sintassi è un errore che si verifica quando scrivi codice che viola le regole del linguaggio di programmazione che stai utilizzando. Ciò si traduce in una riga di codice non valida.

In Python, ad esempio, quando si stampa una stringa, deve essere inserita tra virgolette. In caso contrario, si verifica un errore di sintassi.

Un errore di sintassi può verificarsi anche quando non si aprono o si chiudono parentesi, parentesi quadre o parentesi graffe, si sbagliano parole chiave o nomi di funzioni, si perdono i due punti alla fine delle istruzioni di controllo del flusso o quando si perdono gli operatori richiesti nelle espressioni.

Generalmente, si verificheranno errori di sintassi se si viola una regola su come dovrebbe essere scritto il codice 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))

Dopo aver eseguito il codice precedente, ti imbatterai in un messaggio di errore come mostrato di seguito:

Il messaggio di errore dall’esecuzione del codice è il seguente:

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

Per risolvere questi errori, usa la sintassi Python corretta come mostrato di seguito:

print("Hello World")

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

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

Errore di indentazione

A differenza di altri linguaggi come Java, C o C++, che usano le parentesi graffe per separare i blocchi di codice, Python usa l’indentazione per definire la gerarchia e la struttura dei blocchi di codice. Ad esempio, quando si scrivono istruzioni di controllo in Java, tutto il codice da eseguire una volta che la condizione è stata valutata è contenuto tra parentesi graffe.

In Python, invece, il blocco di codice sarà rientrato. Un tipico rientro in Python consiste in quattro spazi o una tabulazione. Tuttavia, il numero di spazi non ha importanza finché rimane coerente in tutto il codice che viene scritto.

In qualità di programmatore Python, è probabile che si verifichino errori di indentazione quando non si aggiunge l’indentazione richiesta, ad esempio quando si scrivono istruzioni o funzioni di controllo, quando si utilizzano sia tabulazioni che spazi per creare indentazioni in quanto confonde l’interprete, quando si inseriscono indentazioni nel posto sbagliato o quando i tuoi rientri non sono coerenti in tutta la tua base di codice.

Di seguito è riportato un esempio di codice che genera un errore di indentazione:

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

I messaggi di errore risultanti dal codice precedente sono mostrati di seguito:

Il messaggio di errore dall’esecuzione del codice è il seguente:

  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

Per correggere gli errori, è necessario indentare la riga dopo l’istruzione if come indentazione e assicurarsi che corrisponda all’indentazione nel resto del codice, come mostrato di seguito:

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

TipoErrore

In Python, un TypeError è un’eccezione che si verifica quando si tenta di eseguire un’operazione utilizzando un tipo di dati incompatibile. Ad esempio, se provi ad aggiungere una stringa e un numero intero o concatenare un tipo di dati stringa con un numero intero, incontrerai un TypeError.

Puoi anche riscontrare TypeErrors quando usi funzioni o metodi con tipi di dati non corretti, quando provi a usare un indice non intero per accedere agli elementi in un iterabile come un elenco o quando provi a scorrere un oggetto che non può essere iterabile.

In genere, qualsiasi operazione che utilizza un tipo di dati errato porterà a un TypeError.

Di seguito sono riportati esempi di operazioni che possono portare 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"])

I messaggi di errore risultanti dal codice sopra mostrato sono mostrati di seguito:

Di seguito è mostrato un esempio di messaggio TypeError dal codice:

  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

Per rimuovere gli errori, utilizza i tipi di dati corretti o le conversioni di tipo come mostrato di seguito:

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])

AttributeError

In Python, un AttributeError si verifica quando si tenta di utilizzare un attributo che non esiste sull’oggetto o si chiama un metodo che non esiste sull’oggetto su cui viene chiamato. Un AttributeError mostra che un oggetto non ha un attributo o un metodo che viene chiamato su di esso.

Ad esempio, se chiami un metodo stringa su un numero intero, ti imbatterai in un AttributeError perché il metodo non esiste sul tipo di oggetto su cui lo stai chiamando.

Nell’esempio mostrato di seguito, il metodo capitalize(), utilizzato per convertire la prima lettera di una stringa in maiuscolo, viene chiamato su un numero intero. Il risultato è un errore di attributo perché int non ha il metodo capitalize().

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

L’esecuzione di questo codice genera il messaggio di errore mostrato di seguito:

Il messaggio AttributeError dal codice è il seguente:

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

Per risolvere un AttributeError, assicurati che il metodo o l’attributo che stai chiamando esista sul tipo di oggetto su cui lo stai chiamando. In questo caso, la chiamata capitalize() su un tipo di dati stringa risolve questo errore come mostrato di seguito:

Errore di importazione

L’ImportError in Python si verifica quando si tenta di importare un modulo che non può essere trovato o non è accessibile nell’ambiente corrente. Potrebbe essere che non sia ancora installato, che tu non abbia configurato correttamente il suo percorso o che tu abbia digitato male il modulo che stai tentando di installare.

Un ImportError ha una singola sottoclasse figlia chiamata ModuleNotFoundError che è l’errore che viene generato quando si tenta di importare un modulo che non può essere trovato.

Ad esempio, il codice seguente con i tentativi di importare i panda della libreria di analisi dei dati genera un errore di questo tipo perché il modulo non è ancora installato.

Il messaggio ImportError generato è mostrato di seguito:

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

Per risolvere tale errore, assicurati che i moduli che stai tentando di importare siano stati installati. Nel caso in cui ciò non risolva l’errore, controlla se stai usando l’ortografia corretta per il modulo e il percorso file corretto per accedere al modulo.

ValoreErrore

Questa è un’eccezione che si verifica quando una funzione in Python riceve un valore del tipo di dati corretto ma il valore è un valore inappropriato. Ad esempio, la funzione Math.sqrt() utilizzata per trovare la radice quadrata dei valori numerici restituirà un ValueError se si passa un numero negativo.

Per quanto il valore sarà del tipo corretto, cioè un valore numerico, essere negativo lo rende un valore inappropriato per il

La funzione int() che converte un numero o una stringa restituirà un ValueError se si passa una stringa che non è un valore stringa numerico. Il passaggio di “123” o “45” alla funzione non restituisce alcun errore in quanto le stringhe possono essere convertite nel valore intero appropriato.

Tuttavia, se si passa una stringa che non è un valore stringa numerico come “Ciao”, restituisce un ValueError. Questo perché “Ciao” sebbene sia una stringa, non è appropriato in quanto non ha un equivalente intero.

Di seguito è riportato un esempio di codice che 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)

Gli errori dal codice sopra sono mostrati di seguito:

Il messaggio di errore generato è il seguente:

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

Per correggere l’errore, utilizzare i valori appropriati nelle funzioni come mostrato di seguito:

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

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

IOError

IOError(Input/Output Error) è un’eccezione che si verifica quando un’operazione di input o output non riesce. Ciò può essere causato dal tentativo di accedere a un file che non esiste, spazio su disco insufficiente nel dispositivo, tentativo di accedere a un file per il quale non si dispone di autorizzazioni sufficienti o quando si tenta di accedere a un file attualmente in uso da altre operazioni.

Metodi come open(), read(), write() e close() che vengono generalmente utilizzati quando si lavora con i file sono quelli che probabilmente causano un tale errore.

Considera il codice seguente che tenta di aprire un file chiamato “notes.txt” che non esiste. Il codice genera un errore IOError che genera l’errore FileNotFoundError:

Con il seguente messaggio di errore:

  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'

Per evitare l’errore di cui sopra, tutto ciò che devi fare è assicurarti che il file “notes.txt” esista nella directory in cui esegui il terminale. Un altro modo per gestire IOErrors è usare il blocco tryexcept, come mostrato di seguito:

NomeErrore

NameError è un’eccezione che incontrerai quando tenti di utilizzare una variabile, una funzione o un modulo che non esiste, non è definito nell’ambito corrente o non è stato assegnato un valore.

Un tale errore si verifica in genere quando si digitano in modo errato nomi di variabili o funzioni o li si utilizza prima che vengano definiti. Anche l’utilizzo di un modulo senza importarlo risulterà in un NameError.

Il codice seguente genererà un’eccezione 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

I seguenti messaggi di errore derivano dal codice precedente:

Di seguito viene mostrato un esempio di messaggio NameError:

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

Per risolvere un tale NameError, assicurati di non utilizzare i moduli prima di importarli, di non utilizzare variabili o funzioni prima di definirle e di non eseguire errori di ortografia di funzioni o nomi di variabili:

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

y = 23
print(y)

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

IndexError

Un IndexError è un’eccezione che si verifica quando si tenta di accedere a un indice in un elenco o in una tupla non compresa nell’intervallo. Considera l’elenco seguente:

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

L’elenco ha cinque elementi. Python conta gli indici da 0 (zero). Pertanto, l’elenco sopra ha indici che vanno da 0 a n-1, dove n è il numero o gli elementi nell’elenco. In questo caso, l’indice o la lista andranno da 0 a 4.

Se provi ad accedere a un elemento con un indice maggiore di 4, ti imbatterai in un IndexError perché l’indice è fuori dall’intervallo nell’elenco da cui stai tentando di accedere a un elemento. Il codice seguente genera un IndexError:

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

L’errore dal codice è mostrato di seguito:

Il messaggio IndexError generato è il seguente:

  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

Il modo migliore per evitare un IndexError è utilizzare le funzioni range() e len() per assicurarti di accedere solo agli elementi che si trovano all’interno dell’intervallo in questo modo:

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

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

KeyError

Un KeyError è un’eccezione che si verifica quando si tenta di accedere a un elemento da un dizionario utilizzando una chiave e la chiave non viene trovata nel dizionario. Considera il dizionario qui sotto:

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

Le chiavi del dizionario sono “Canada”, “USA”, “Italia”. Puoi accedere alle voci del dizionario delle città utilizzando i tre tasti. Tuttavia, se provi ad accedere a un elemento utilizzando una chiave che non esiste, come “Brasile”, ti imbatterai in un KeyError, come mostrato di seguito:

Il messaggio KeyError generato è mostrato di seguito:

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

Per risolvere un KeyError, assicurati che le chiavi che stai utilizzando per accedere agli elementi in un dizionario siano effettivamente presenti nel dizionario. Per fare questo, puoi usare un’istruzione if…else in questo modo:

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")

In questo modo, eviterai di imbatterti in KeyErrors quando accedi agli elementi da un dizionario

Conclusione

Quando codifichi in Python, indipendentemente dal tuo livello di esperienza, sei destinato a riscontrare errori. Pertanto, assicurati di familiarizzare con i diversi tipi di errori evidenziati nell’articolo per assicurarti di essere in grado di gestirli quando si presentano.

Puoi anche esplorare alcune utili battute di Python per semplificare le attività comuni.