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 ви, ймовірно, зіткнетеся з помилками відступів, якщо не додасте необхідні відступи, наприклад, коли пишете керуючі оператори чи функції, коли ви використовуєте табуляцію та пробіли для створення відступів, оскільки це заплутує інтерпретатора, коли ви ставите відступи у неправильному місці або коли ваші відступи не є узгодженими у вашій кодовій базі.

Нижче наведено приклад коду, який призводить до помилки відступу:

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

Повідомлення про помилки, які випливають із коду вище, показані нижче:

  Як створити скрінкаст за допомогою Microsoft PowerPoint

Повідомлення про помилку під час запуску коду таке:

  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 виникає, коли ви намагаєтеся імпортувати модуль, який неможливо знайти або який недоступний у поточному середовищі. Можливо, він ще не встановлений, ви неправильно налаштували його шлях або ви неправильно написали модуль, який намагаєтеся встановити.

  Що таке Ambient Computing і як він змінить наше життя?

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 (помилка вводу/виводу) — це виняток, який виникає, коли операція введення або виведення не вдається. Це може бути спричинено спробою отримати доступ до неіснуючого файлу, недостатнім обсягом пам’яті на диску вашого пристрою, спробою отримати доступ до файлу, для доступу до якого у вас немає достатніх дозволів, або спробою отримати доступ до файлу, який зараз використовується іншими операціями.

Такі методи, як 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» існує в каталозі, у якому запущено термінал. Інший спосіб обробки помилок вводу-виводу — використання блоку try osim, як показано нижче:

NameError

Помилка NameError — це виняток, з яким ви зіткнетеся, коли спробуєте використати змінну, функцію чи модуль, які не існують, не визначені в поточній області чи яким не присвоєно значення.

Така помилка зазвичай виникає, коли ви неправильно вписуєте імена змінних або функцій або використовуєте їх до того, як вони визначені. Використання модуля без його імпорту також призведе до помилки NameError.

  Початок роботи з Grafana Tempo

Наступний код призведе до виключення 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"}

Ключі в словнику – «Канада», «США», «Італія». Ви можете отримати доступ до елементів зі словника міст за допомогою трьох клавіш. Однак, якщо ви спробуєте отримати доступ до елемента за допомогою ключа, якого не існує, наприклад «Brazil», ви зіткнетеся з 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, щоб спростити типові завдання.