10 vanliga Python-feltyper och hur man löser dem

Som programmerare kommer du säkert att stöta på fel när du utvecklar programvara. Detta kan sträcka sig från fel i din logik som leder till oväntade resultat, fel som uppstår genom att bryta mot reglerna för ett programmeringsspråk, till även fel som uppstår när du kör ditt program, bland många andra. Dessa fel kallas vanligtvis för buggar.

Buggar finns överallt i alla programmeringsspråk oavsett hur lätt det är att lära sig eller använda språket.

I Python, till exempel, även om språket betonar läsbarhet, följer en uttrycksfull syntax och anses vara relativt lätt att lära sig och använda jämfört med andra programmeringsspråk, är du fortfarande inte immun mot programmeringsfel när du använder Python.

Eftersom fel måste uppstå är ett bra sätt att hantera dem att lära sig om de olika typer av fel som kan uppstå och hur de uppstår. Detta gör att du kan undvika eller minimera dessa fel under programmeringen och även veta hur du ska hantera dem när de uppstår.

Här är några av de vanliga Python-felen som du kan stöta på när du programmerar med språket:

Syntaxfel

Ett syntaxfel är ett fel som uppstår när du skriver kod som bryter mot reglerna för det programmeringsspråk du använder. Detta resulterar i en ogiltig kodrad.

I Python, till exempel, när du skriver ut en sträng, måste den sättas mellan citattecken. Om du inte gör det resulterar det i ett syntaxfel.

Ett syntaxfel kan också uppstå när du missar att öppna eller stänga parenteser, hakparenteser eller klammerparenteser, felstavar nyckelord eller funktionsnamn, missar kolon i slutet av flödeskontrollsatser eller när du missar nödvändiga operatorer i uttryck.

Generellt sett kommer syntaxfel att uppstå om du bryter mot en regel om hur Python-kod ska skrivas.

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

När du kör ovanstående kod kommer du att stöta på ett felmeddelande som visas nedan:

Felmeddelandet från att köra koden är som följer:

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

För att lösa dessa fel, använd rätt Python-syntax enligt nedan:

print("Hello World")

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

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

Indragningsfel

Till skillnad från andra språk som Java, C eller C++, som använder hängslen för att separera kodblock, använder Python indrag för att definiera hierarkin och strukturen för kodblock. Till exempel, när du skriver kontrollsatser i Java, finns all kod som ska exekveras när villkoret har utvärderats inuti hängslen.

I Python kommer dock kodblocket att dras in. En typisk indragning i Python består av fyra blanksteg eller en tabb. Antalet mellanslag spelar dock ingen roll så länge det förblir konsekvent genom hela koden som skrivs.

Som Python-programmerare kommer du sannolikt att stöta på indragsfel när du misslyckas med att lägga till nödvändig indrag, till exempel när du skriver kontrollsatser eller funktioner, när du använder både tabb och mellanslag för att skapa indrag eftersom det förvirrar tolken, när du sätter indrag på fel plats eller när dina indrag inte är konsekventa i hela din kodbas.

Ett exempel på kod som resulterar i ett indragsfel visas nedan:

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

Felmeddelandena som härrör från koden ovan visas nedan:

Felmeddelandet från att köra koden är som följer:

  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

För att korrigera felen krävs indrag på raden efter if-satsen som en indrag och se till att den matchar indraget i resten av koden som visas nedan:

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

Skrivfel

I Python är ett TypeError ett undantag som uppstår när du försöker utföra en operation med en inkompatibel datatyp. Om du till exempel försöker lägga till en sträng och ett heltal eller sammanfoga en strängdatatyp med ett heltal, kommer du att stöta på ett TypeError.

Du kan också stöta på TypeErrors när du använder funktioner eller metoder med felaktiga datatyper, när du försöker använda ett icke-heltalsindex för att komma åt objekt i en iterabel, till exempel en lista, eller när du försöker iterera genom ett objekt som inte kan itereras.

I allmänhet kommer varje operation som använder en felaktig datatyp att leda till ett TypeError.

Exempel på operationer som kan leda till TypeErrors visas nedan:

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

Felmeddelandena som härrör från koden ovan visas nedan:

Ett exempel på TypeError-meddelande från koden visas nedan:

  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

För att ta bort felen, använd rätt datatyper eller typkonverteringar enligt nedan:

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

I Python uppstår ett AttributeError när du försöker använda ett attribut som inte finns på objektet eller anropar en metod som inte finns på objektet det anropas på. En AttributeError visar att ett objekt inte har ett attribut eller en metod som anropas.

Till exempel, om du anropar en strängmetod på ett heltal, kommer du att stöta på en AttributeError eftersom metoden inte finns på den typ av objekt du anropar den på.

I exemplet som visas nedan anropas metoden capitalize(), som används för att konvertera den första bokstaven i en sträng till versaler, på ett heltal. Resultatet är ett attributfel eftersom int inte har metoden capitalize() .

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

Att köra den här koden resulterar i felmeddelandet som visas nedan:

AttributeError-meddelandet från koden är som följer:

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

För att lösa ett AttributeError, se till att metoden eller attributet du anropar finns på den typ av objekt du anropar det på. I det här fallet löser det här felet genom att anropa capitalize() på en strängdatatyp:

ImportError

Importfelet i Python uppstår när du försöker importera en modul som inte kan hittas eller inte är tillgänglig i din nuvarande miljö. Det kan vara så att den inte är installerad ännu, att du inte har konfigurerat dess sökväg korrekt eller att du har stavat modulen du försöker installera fel.

En ImportError har en enda underordnad underklass som heter ModuleNotFoundError vilket är felet som uppstår när du försöker importera en modul som inte kan hittas.

Till exempel, koden nedan med försöker importera dataanalysbiblioteket pandas ger ett sådant fel eftersom modulen ännu inte är installerad.

ImportError-meddelandet som genereras visas nedan:

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

För att lösa ett sådant fel, se till att modulerna du försöker importera har installerats. Om det inte löser felet, kontrollera om du använder rätt stavning för modulen och rätt sökväg för att komma åt modulen.

ValueError

Detta är ett undantag som inträffar när en funktion i Python får ett värde av rätt datatyp men värdet är ett olämpligt värde. Till exempel kommer Math.sqrt()-funktionen som används för att hitta kvadratroten ur numeriska värden att returnera ett ValueError om du anger ett negativt tal.

Så mycket som värdet kommer att vara av rätt typ, det vill säga ett numeriskt värde, är det negativt att det blir ett olämpligt värde för

Funktionen int() som konverterar ett tal eller en sträng kommer att returnera ett ValueError om du skickar in en sträng som inte är ett numeriskt strängvärde. Att skicka ”123” eller ”45” till funktionen returnerar inget fel eftersom strängarna kan konverteras till lämpligt heltalsvärde.

Men om du skickar in en sträng som inte är ett numeriskt strängvärde, till exempel ”Hello”, returnerar den ett ValueError. Detta beror på att ”Hej”, även om det är en sträng, är olämpligt eftersom det inte har en heltalsekvivalent.

Ett exempel på kod som genererar ett ValueError visas nedan:

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

Felen från koden ovan visas nedan:

Felmeddelandet som genereras är följande:

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

För att rätta till felet, använd lämpliga värden i funktionerna enligt nedan:

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

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

IOFel

IOError (Input/Output Error) är ett undantag som uppstår när en ingångs- eller utmatningsoperation misslyckas. Detta kan orsakas av att du försöker komma åt en fil som inte finns, otillräckligt lagringsutrymme på din enhet, försöker komma åt en fil som du inte har tillräckliga behörigheter för att komma åt eller när du försöker komma åt en fil som för närvarande används genom andra operationer.

Metoder som open(), read(), write() och close() som vanligtvis används när man arbetar med filer är de som sannolikt orsakar ett sådant fel.

Tänk på koden nedan som försöker öppna en fil som heter ”notes.txt” som inte finns. Koden resulterar i en IOError som väcker FileNotFoundError:

Med följande felmeddelande:

  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'

För att undvika felet ovan är allt du behöver göra att se till att filen ”notes.txt” finns i katalogen du kör terminalen i. Ett annat sätt att hantera IOErrors är att använda try except-blocket, som visas nedan:

Namnfel

NameError är ett undantag som du kommer att stöta på när du försöker använda en variabel, funktion eller modul som inte finns, inte är definierad i det aktuella omfånget eller som inte har tilldelats ett värde.

Ett sådant fel uppstår vanligtvis när du felstavar variabel- eller funktionsnamn eller använder dem innan de definieras. Att använda en modul utan att importera den kommer också att resultera i ett NameError.

Följande kod kommer att resultera i ett NameError-undantag:

# 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

Följande felmeddelanden är resultatet av koden ovan:

Ett exempel på NameError-meddelande visas nedan:

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

För att lösa ett sådant namnfel, se till att du inte använder moduler innan du importerar dem, att du inte använder variabler eller funktioner innan du definierar dem, och att du inte stavar funktions- eller variabelnamn fel:

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

y = 23
print(y)

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

IndexError

Ett IndexError är ett undantag som uppstår när du försöker komma åt ett index i en lista eller tuppel som ligger utanför räckvidden. Tänk på listan nedan:

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

Listan har fem delar. Python räknar index från 0(noll). Därför har listan ovan index som sträcker sig från 0 till n-1, där n är numret eller elementen i listan. I det här fallet kommer indexet eller listan att variera från 0 till 4.

Om du försöker komma åt ett element med ett index som är större än 4, stöter du på ett IndexError eftersom indexet är utanför intervallet i listan du försöker komma åt ett element från. Koden nedan genererar ett IndexError:

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

Felet från koden visas nedan:

IndexError-meddelandet som genereras är som följer:

  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

Det bästa sättet att undvika ett IndexError är att använda funktionerna range() och len() för att säkerställa att du bara kommer åt element som är inom räckvidd som så:

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

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

KeyError

Ett KeyError är ett undantag som uppstår när du försöker komma åt ett objekt från en ordbok med hjälp av en nyckel, och nyckeln finns inte i ordlistan. Tänk på ordboken nedan:

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

Nycklarna i ordboken är ”Kanada”, ”USA”, ”Italien”. Du kan komma åt objekten från stadsordboken med de tre knapparna. Men om du försöker komma åt ett element med hjälp av en nyckel som inte finns, till exempel ”Brasilien”, kommer du att stöta på ett KeyError, som visas nedan:

KeyError-meddelandet som genereras visas nedan:

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

För att lösa ett KeyError, se till att nycklarna du använder för att komma åt element i en ordbok faktiskt finns i ordboken. För att göra detta kan du göra ett if…else-uttalande så här:

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

På så sätt slipper du stöta på KeyErrors när du kommer åt element från en ordbok

Slutsats

När du kodar i Python, oavsett din kompetensnivå, kommer du säkert att stöta på fel. Se därför till att bekanta dig med de olika typerna av fel som markeras i artikeln för att säkerställa att du kan hantera dem när de uppstår.

Du kan också utforska några användbara Python one-liners för att förenkla vanliga uppgifter.