10 gyakori Python-hibatípus és megoldásuk

Programozóként biztosan találkozhat hibákkal a szoftverfejlesztés során. Ez a váratlan eredményekhez vezető logikai hibáktól, a programozási nyelv szabályainak megsértéséből adódó hibáktól kezdve a program futtatása közben fellépő hibákig terjedhet, sok egyéb mellett. Ezeket a hibákat általában hibáknak nevezik.

A hibák minden programozási nyelvben jelen vannak, függetlenül attól, hogy mennyire könnyű megtanulni vagy használni a nyelvet.

A Pythonban például, bár a nyelv az olvashatóságot hangsúlyozza, kifejező szintaxist követ, és más programozási nyelvekhez képest viszonylag könnyen elsajátíthatónak és használhatónak tekinthető, a Python használata során mégsem vagy védett a programozási hibákkal szemben.

Mivel hibák biztosan előfordulnak, jó módja annak, hogy kezeljük őket, ha megismerjük a különböző típusú hibákat és azok előfordulási módját. Ez lehetővé teszi, hogy elkerülje vagy minimalizálja ezeket a hibákat programozás közben, és tudja, hogyan kell kezelni őket, amikor felmerülnek.

Íme néhány gyakori Python hiba, amely a nyelv használatával történő programozás során előfordulhat:

Szintaxishibák

A szintaktikai hiba olyan hiba, amely akkor lép fel, amikor olyan kódot írunk, amely sérti az Ön által használt programozási nyelv szabályait. Ez érvénytelen kódsort eredményez.

A Pythonban például egy karakterlánc kinyomtatása során azt idézőjelek közé kell tenni. Ennek elmulasztása szintaktikai hibát eredményez.

Szintaktikai hiba akkor is előfordulhat, ha kihagyja a nyitó vagy záró zárójeleket, szögletes zárójeleket vagy kapcsos kapcsos zárójeleket, hibásan ír el kulcsszavakat vagy függvényneveket, kihagyja a kettőspontokat a folyamatvezérlő utasítások végén, vagy ha kihagyja a szükséges operátorokat a kifejezésekből.

Általában szintaktikai hibák lépnek fel, ha megszegi a Python-kód írási módjára vonatkozó szabályt.

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

A fenti kód futtatásakor az alábbi hibaüzenet jelenik meg:

A kód futtatásával kapcsolatos hibaüzenet a következő:

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

A hibák megoldásához használja a megfelelő Python szintaxist az alábbiak szerint:

print("Hello World")

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

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

IndentationError

Más nyelvektől eltérően, mint például a Java, C vagy C++, amelyek kapcsos zárójeleket használnak a kódblokkok elválasztására, a Python behúzást használ a kódblokkok hierarchiájának és szerkezetének meghatározásához. Például, amikor vezérlő utasításokat ír Java nyelven, a feltétel kiértékelése után végrehajtandó összes kód kapcsos zárójelben található.

A Pythonban azonban a kódblokk behúzódik. A Python tipikus behúzása négy szóközből vagy egy tabulátorból áll. A szóközök száma azonban nem számít, amíg konzisztens marad a kódírás alatt.

Python programozóként valószínűleg behúzási hibákkal találkozhat, ha nem adja hozzá a szükséges behúzást, például vezérlő utasítások vagy függvények írásakor, amikor a tabulátort és a szóközöket egyaránt használja a behúzások létrehozásához, mivel ez megzavarja az értelmezőt, amikor behúzásokat tesz. rossz helyen, vagy ha a behúzások nem következetesek a kódbázisban.

Az alábbiakban látható egy példa arra a kódra, amely behúzási hibát eredményez:

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

A fenti kódból származó hibaüzenetek az alábbiakban láthatók:

  Hogyan veheti igénybe a Microsoft Excelt a bizonytalanság kiszámításához

A kód futtatásával kapcsolatos hibaüzenet a következő:

  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

A hibák kijavításához az if utasítás utáni sort behúzás szükséges, és győződjön meg arról, hogy az megegyezik a kód többi részének behúzásával, az alábbiak szerint:

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

TypeError

A Pythonban a TypeError egy kivétel, amely akkor fordul elő, ha nem kompatibilis adattípussal próbál végrehajtani egy műveletet. Például, ha megpróbál hozzáadni egy karakterláncot és egy egész számot, vagy egy karakterlánc-adattípust egy egész számmal fűz össze, akkor TypeError-t fog találni.

Típushibákkal akkor is találkozhat, ha nem megfelelő adattípusú függvényeket vagy metódusokat használ, ha nem egész számú indexet próbál használni egy iterálható elemhez, például egy listához, vagy ha olyan objektumon keresztül próbál meg ismételni, amely nem iterálható.

Általában minden helytelen adattípust használó művelet TypeError-hoz vezet.

Az alábbiakban példák láthatók azokra a műveletekre, amelyek TypeErrors-hoz vezethetnek:

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

A fenti kódból származó hibaüzenetek az alábbiakban láthatók:

Az alábbiakban egy minta TypeError üzenet látható a kódból:

  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

A hibák eltávolításához használja a megfelelő adattípusokat vagy típuskonverziókat az alábbiak szerint:

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

A Pythonban AttributeError akkor fordul elő, ha olyan attribútumot próbál meg használni, amely nem létezik az objektumon, vagy olyan metódust hív meg, amely nem létezik a meghívott objektumon. Az AttributeError azt jelzi, hogy egy objektumhoz nem tartozik attribútum vagy metódus, amelyet meghívnak.

Ha például egy karakterlánc metódust egész számon hív meg, akkor AttributeError hibaüzenetet fog kapni, mivel a metódus nem létezik azon az objektumtípuson, amelyen meghívja.

Az alábbi példában a nagybetűs() metódus, amely egy karakterlánc első betűjét nagybetűssé alakítja, egy egész számra kerül meghívásra. Az eredmény attribútumhiba, mert az int nem rendelkezik a capitalize() metódussal.

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

A kód futtatása az alábbi hibaüzenetet eredményezi:

A kódból származó AttributeError üzenet a következő:

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

Az AttributeError megoldásához győződjön meg arról, hogy a meghívott metódus vagy attribútum létezik azon az objektumon, amelyen meghívja. Ebben az esetben a kapitalize() meghívása egy karakterlánc adattípuson megoldja ezt a hibát az alábbiak szerint:

ImportError

Az ImportError a Pythonban akkor fordul elő, amikor olyan modult próbál meg importálni, amely nem található vagy nem érhető el az aktuális környezetben. Előfordulhat, hogy még nincs telepítve, nem konfigurálta megfelelően az elérési utat, vagy rosszul írta le a telepíteni kívánt modult.

  Hogyan ellenőrizhető, hogy a Chromecast továbbra is kap-e frissítéseket

Az ImportErrornak egyetlen gyermek alosztálya van, ModuleNotFoundError, amely a nem található modul importálásakor megjelenő hiba.

Például az alábbi kód megpróbálja importálni az adatelemzési könyvtárat, a pandas ilyen hibát dob, mert a modul még nincs telepítve.

A generált ImportError üzenet az alábbiakban látható:

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

Egy ilyen hiba megoldásához győződjön meg arról, hogy az importálni kívánt modulok telepítve vannak. Ha ez nem oldja meg a hibát, ellenőrizze, hogy a modul helyesírását és a megfelelő fájl elérési útját használja-e a modul eléréséhez.

ValueError

Ez egy kivétel, amely akkor fordul elő, ha a Python egyik függvénye a megfelelő adattípusú értéket kap, de az érték nem megfelelő. Például a számértékek négyzetgyökének megkeresésére használt Math.sqrt() függvény ValueError értéket ad vissza, ha negatív számot ad meg.

Bármennyire is az érték megfelelő típusú, azaz számérték, a negatív lévén nem megfelelő érték a

A számot vagy karakterláncot átalakító int() függvény ValueError értéket ad vissza, ha olyan karakterláncot ad át, amely nem numerikus karakterláncérték. A „123” vagy „45” átadása a függvénynek nem ad vissza hibát, mivel a karakterláncok konvertálhatók a megfelelő egész értékre.

Ha azonban olyan karakterláncot ad át, amely nem numerikus karakterláncérték, például a „Hello”, akkor ValueError-t ad vissza. Ennek az az oka, hogy a „Hello” bár egy karakterlánc, nem megfelelő, mivel nincs egész szám megfelelője.

Az alábbiakban látható egy példa arra a kódra, amely ValueErrort generál:

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

A fenti kódból származó hibák az alábbiakban láthatók:

A generált hibaüzenet a következő:

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

A hiba kijavításához használja a megfelelő értékeket a függvényekben az alábbiak szerint:

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

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

IOError

Az IOError (Input/Output Error) egy kivétel, amely akkor fordul elő, ha egy bemeneti vagy kimeneti művelet meghiúsul. Ennek oka lehet, hogy nem létező fájlhoz próbál hozzáférni, nincs elegendő lemeztárhely az eszközön, olyan fájlhoz próbál hozzáférni, amelyhez nem rendelkezik megfelelő jogosultságokkal, vagy egy éppen használt fájlhoz próbál hozzáférni. egyéb műveletekkel.

Az olyan módszerek, mint az open(), read(), write() és close(), amelyeket általában a fájlokkal való munka során használnak, valószínűleg okozhatnak ilyen hibát.

Tekintsük az alábbi kódot, amely megpróbál megnyitni egy „notes.txt” nevű fájlt, amely nem létezik. A kód IOError-t eredményez, amely felveti a FileNotFoundError-t:

A következő hibaüzenettel:

  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'

A fenti hiba elkerülése érdekében nem kell mást tennie, mint megbizonyosodni arról, hogy a „notes.txt” fájl létezik abban a könyvtárban, amelyben a terminált futtatja. Az IOError-ok kezelésének másik módja a try kivétel blokk használata, az alábbiak szerint:

NameError

A NameError egy kivétel, amellyel akkor találkozhat, ha olyan változót, függvényt vagy modult próbál meg használni, amely nem létezik, nincs meghatározva az aktuális hatókörben, vagy nincs hozzárendelve értékhez.

Ilyen hiba általában akkor fordul elő, ha hibásan írja le a változó- vagy függvényneveket, vagy a definiálásuk előtt használja azokat. Ha egy modult importálás nélkül használ, az is NameError-t eredményez.

  A React vs React Native megértése

A következő kód NameError kivételt eredményez:

# 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

A következő hibaüzenetek a fenti kódból származnak:

Az alábbiakban egy minta NameError üzenet látható:

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

Egy ilyen névhiba megoldásához győződjön meg arról, hogy nem használ modulokat, mielőtt importálja őket, ne használjon változókat vagy függvényeket a definiálásuk előtt, és ne írja el rosszul a függvény- vagy változóneveket:

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

y = 23
print(y)

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

IndexError

Az IndexError egy kivétel, amely akkor fordul elő, ha egy listában vagy soron kívül eső indexhez próbál hozzáférni. Fontolja meg az alábbi listát:

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

A lista öt elemből áll. A Python 0-tól (nullától) számolja az indexeket. Ezért a fenti lista indexei 0 és n-1 között vannak, ahol n a lista száma vagy elemei. Ebben az esetben az index vagy a lista 0 és 4 között lesz.

Ha egy 4-nél nagyobb indexű elemhez próbál hozzáférni, akkor IndexError hibaüzenetet kap, mert az index kívül esik azon a listán, amelyből az elemet megpróbálja elérni. Az alábbi kód IndexError-t generál:

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

A kódból származó hiba az alábbiakban látható:

Az IndexError üzenet a következő:

  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

Az IndexError elkerülésének legjobb módja a range() és len() függvények használata annak biztosítására, hogy csak a hatótávolságon belüli elemeket érje el, például:

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

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

KeyError

A KeyError egy kivétel, amely akkor fordul elő, ha egy kulcs segítségével próbál elérni egy elemet egy szótárból, és a kulcs nem található a szótárban. Tekintsük az alábbi szótárat:

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

A szótár kulcsai: „Kanada”, „USA”, „Olaszország”. A városi szótár elemeit a három gombbal érheti el. Ha azonban nem létező kulccsal próbál hozzáférni egy elemhez, például „Brazília”, akkor egy KeyError hibaüzenetet fog kapni, ahogy az alább látható:

A generált KeyError üzenet az alábbiakban látható:

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

A KeyError megoldásához győződjön meg arról, hogy a szótár elemeinek eléréséhez használt kulcsok valóban jelen vannak a szótárban. Ehhez megadhat egy if…más kijelentést, például:

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

Így elkerülheti, hogy kulcshibákba ütközzenek, amikor egy szótár elemeihez hozzáférnek

Következtetés

Amikor Pythonban kódol, szaktudásod szintjétől függetlenül biztosan találkozhatsz hibákkal. Ezért feltétlenül ismerkedjen meg a cikkben kiemelt különböző típusú hibákkal, hogy biztosan tudja kezelni őket, amikor felmerülnek.

Felfedezhet néhány hasznos Python egysoros programot is a gyakori feladatok egyszerűsítésére.