10 често срещани типа грешки на Python и как да ги разрешите

Като програмист вие сте длъжни да срещнете грешки, докато разработвате софтуер. Това може да варира от грешки във вашата логика, водещи до неочаквани резултати, грешки, произтичащи от нарушаване на правилата на език за програмиране, до дори грешки, които възникват при изпълнение на вашата програма, сред много други. Тези грешки обикновено се наричат ​​грешки.

Грешките са повсеместни във всеки език за програмиране, независимо колко лесен е за изучаване или използване на езика.

В Python, например, въпреки че езикът набляга на четливостта, следва експресивен синтаксис и се счита за относително лесен за научаване и използване в сравнение с други езици за програмиране, все още не сте имунизирани срещу програмни грешки, когато използвате Python.

Тъй като грешките са длъжни да възникнат, добър начин да се справите с тях е да научите за различните видове грешки, които могат да възникнат и как се появяват. Това ви позволява да избегнете или минимизирате тези грешки по време на програмиране и също така да знаете как да се справите с тях, когато възникнат.

Ето някои от често срещаните грешки на Python, които може да срещнете, докато програмирате с помощта на езика:

SyntaxErrors

Синтактичната грешка е грешка, която възниква, когато пишете код, който нарушава правилата на езика за програмиране, който използвате. Това води до невалиден ред код.

В Python, например, когато се отпечатва низ, той трябва да бъде поставен между кавички. Неспазването на това води до синтактична грешка.

Синтактична грешка може също да възникне, когато пропуснете отварящи или затварящи скоби, квадратни скоби или къдрави скоби, грешно изписване на ключови думи или имена на функции, пропускане на двоеточие в края на операторите за управление на потока или когато пропускате задължителни оператори в изрази.

Като цяло ще възникнат синтактични грешки, ако нарушите правило за това как трябва да бъде написан кодът на 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))

При изпълнение на горния код ще получите съобщение за грешка, както е показано по-долу:

Съобщението за грешка от изпълнението на кода е както следва:

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

За да разрешите тези грешки, използвайте правилния синтаксис на Python, както е показано по-долу:

print("Hello World")

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

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

IndentationError

За разлика от други езици като Java, C или C++, които използват фигурни скоби за разделяне на блокове от код, Python използва отстъп, за да дефинира йерархията и структурата на блоковете от код. Например, когато пишете контролни изрази в Java, целият код, който трябва да бъде изпълнен след като условието бъде оценено, се съдържа във фигурни скоби.

В Python обаче блокът от код ще бъде с отстъп. Типичният отстъп в Python се състои от четири интервала или един раздел. Въпреки това, броят на интервалите няма значение, стига да остане последователен през целия написан код.

Като програмист на Python е вероятно да срещнете грешки при отстъпа, когато не успеете да добавите необходимия отстъп, като например когато пишете контролни изрази или функции, когато използвате и раздел, и интервали, за да създадете отстъпи, тъй като това обърква интерпретатора, когато поставите отстъпи на грешното място или когато вашите вдлъбнатини не са последователни в цялата ви кодова база.

  16 инструмента за оценка преди назначаване, които да ви помогнат при следващото ви наемане

Пример за код, който води до грешка при отстъп, е показан по-долу:

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

Съобщенията за грешка, произтичащи от горния код, са показани по-долу:

Съобщението за грешка от изпълнението на кода е както следва:

  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

За да коригирате грешките, направете отстъп на реда след командата if, тъй като е необходим отстъп и се уверете, че съответства на отстъпа в останалата част от кода, както е показано по-долу:

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

В Python TypeError е изключение, което възниква, когато се опитате да извършите операция, използвайки несъвместим тип данни. Например, ако се опитате да добавите низ и цяло число или да свържете низов тип данни с цяло число, ще срещнете TypeError.

Можете също така да срещнете TypeErrors, когато използвате функции или методи с неправилни типове данни, когато се опитвате да използвате нецяло числов индекс за достъп до елементи в итерируем като списък, или когато се опитвате да итерирате през обект, който не може да бъде итерируем.

Обикновено всяка операция, използваща неправилен тип данни, ще доведе до TypeError.

Примери за операции, които могат да доведат до 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"])

Съобщенията за грешки, произтичащи от показания по-горе код, са показани по-долу:

Примерно съобщение за TypeError от кода е показано по-долу:

  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

За да премахнете грешките, използвайте правилните типове данни или преобразувания на типове, както е показано по-долу:

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

В Python AttributeError възниква, когато се опитате да използвате атрибут, който не съществува в обекта, или извикате метод, който не съществува в обекта, на който се извиква. AttributeError показва, че даден обект няма атрибут или метод, който се извиква за него.

Например, ако извикате низов метод на цяло число, ще се сблъскате с AttributeError, защото методът не съществува за типа обект, на който го извиквате.

В примера, показан по-долу, методът capitalize(), който се използва за преобразуване на първата буква от низ в главна буква, се извиква за цяло число. Резултатът е грешка в атрибута, защото int няма метода capitalize().

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

Изпълнението на този код води до съобщението за грешка, показано по-долу:

Съобщението AttributeError от кода е както следва:

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

За да разрешите AttributeError, уверете се, че методът или атрибутът, който извиквате, съществува в типа обект, на който го извиквате. В този случай извикването на capitalize() за низов тип данни решава тази грешка, както е показано по-долу:

ImportError

ImportError в Python възниква, когато се опитате да импортирате модул, който не може да бъде намерен или не е достъпен в текущата ви среда. Възможно е той все още да не е инсталиран, да не сте конфигурирали правилно пътя му или да сте написали грешно модула, който се опитвате да инсталирате.

  Как да архивирате и разархивирате файлове и папки на Mac

ImportError има един дъщерен подклас, наречен ModuleNotFoundError, което е грешката, която се хвърля, когато се опитате да импортирате модул, който не може да бъде намерен.

Например кодът по-долу с опит за импортиране на библиотеката за анализ на данни pandas извежда такава грешка, тъй като модулът все още не е инсталиран.

Генерираното съобщение ImportError е показано по-долу:

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

За да разрешите такава грешка, уверете се, че модулите, които се опитвате да импортирате, са инсталирани. В случай, че това не реши грешката, проверете дали използвате правилния правопис за модула и правилния файлов път за достъп до модула.

ValueError

Това е изключение, което възниква, когато функция в Python получи стойност от правилния тип данни, но стойността е неподходяща стойност. Например функцията Math.sqrt(), използвана за намиране на корен квадратен от числови стойности, ще върне ValueError, ако подадете отрицателно число.

Колкото и стойността да е от правилния тип, т.е. числова стойност, това, че е отрицателна, я прави неподходяща стойност за

Функцията int(), която преобразува число или низ, ще върне ValueError, ако подадете низ, който не е числова стойност на низ. Предаването на „123“ или „45“ към функцията не връща грешка, тъй като низовете могат да бъдат преобразувани в подходящата целочислена стойност.

Ако обаче подадете низ, който не е числова стойност на низ, като например „Hello“, той връща ValueError. Това е така, защото „Hello“, въпреки че е низ, е неподходящо, тъй като няма еквивалент на цяло число.

Пример за код, който генерира 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)

Грешките от горния код са показани по-долу:

Генерираното съобщение за грешка е както следва:

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

За да коригирате грешката, използвайте подходящи стойности във функциите, както е показано по-долу:

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

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

IOError

IOError (Input/Output Error) е изключение, което възниква, когато входна или изходна операция е неуспешна. Това може да бъде причинено от опит за достъп до файл, който не съществува, недостатъчно дисково пространство в устройството ви, опит за достъп до файл, за който нямате достатъчно разрешения за достъп, или когато се опитате да получите достъп до файл, който се използва в момента чрез други операции.

Методи като open(), read(), write() и close(), които обикновено се използват при работа с файлове, са тези, които вероятно ще причинят такава грешка.

Помислете за кода по-долу, който се опитва да отвори файл, наречен „notes.txt“, който не съществува. Кодът води до IOError, което повдига FileNotFoundError:

Със следното съобщение за грешка:

  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'

За да избегнете грешката по-горе, всичко, което трябва да направите, е да се уверите, че файлът „notes.txt“ съществува в директорията, в която стартирате терминала. Друг начин за справяне с IOErrors е използването на блока за изключение на опита, както е показано по-долу:

NameError

NameError е изключение, което ще срещнете, когато се опитате да използвате променлива, функция или модул, който не съществува, не е дефиниран в текущия обхват или не му е присвоена стойност.

  Sortd ви дава интерфейс, базиран на списък, за да организирате имейли [Chrome]

Такава грешка обикновено възниква, когато грешите имената на променливи или функции или ги използвате, преди да са дефинирани. Използването на модул без импортирането му също ще доведе до NameError.

Следният код ще доведе до изключение 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

Следните съобщения за грешка са резултат от горния код:

Примерно съобщение за NameError е показано по-долу:

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

За да разрешите такава NameError, уверете се, че не използвате модули, преди да ги импортирате, не използвате променливи или функции, преди да ги дефинирате, и не пишете грешно имена на функции или променливи:

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

y = 23
print(y)

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

IndexError

IndexError е изключение, което възниква, когато се опитате да получите достъп до индекс в списък или кортеж, който е извън обхвата. Разгледайте списъка по-долу:

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

Списъкът има пет елемента. Python брои индексите от 0 (нула). Следователно списъкът по-горе има индекси, вариращи от 0 до n-1, като n е числото или елементите в списъка. В този случай индексът или списъкът ще варира от 0 до 4.

Ако се опитате да получите достъп до елемент с индекс, по-голям от 4, ще попаднете на IndexError, защото индексът е извън обхвата в списъка, от който се опитвате да получите достъп до елемент. Кодът по-долу генерира IndexError:

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

Грешката от кода е показана по-долу:

Генерираното съобщение IndexError е както следва:

  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

Най-добрият начин да избегнете IndexError е да използвате функциите range() и len(), за да сте сигурни, че имате достъп само до елементи, които са в рамките на обхвата, така:

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

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

KeyError

KeyError е изключение, което възниква, когато се опитате да получите достъп до елемент от речник с помощта на ключ и ключът не е намерен в речника. Помислете за речника по-долу:

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

Ключовете в речника са “Канада”, “САЩ”, “Италия”. Можете да получите достъп до елементите от речника на градовете, като използвате трите клавиша. Въпреки това, ако се опитате да осъществите достъп до елемент с помощта на ключ, който не съществува, като например „Бразилия“, ще попаднете на KeyError, както е показано по-долу:

Генерираното съобщение KeyError е показано по-долу:

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

За да разрешите KeyError, уверете се, че ключовете, които използвате за достъп до елементи в речник, действително присъстват в речника. За да направите това, можете да използвате оператор if…else така:

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

По този начин ще избегнете попадането на KeyErrors при достъп до елементи от речник

Заключение

Когато кодирате в Python, независимо от вашето ниво на опит, непременно ще срещнете грешки. Затова не забравяйте да се запознаете с различните типове грешки, подчертани в статията, за да сте сигурни, че можете да се справите с тях, когато възникнат.

Можете също така да разгледате някои полезни едноредови Python, за да опростите обичайните задачи.