Українська
Налагодження в PyCharm і pdb
Налагодження програми в PyCharm
Налагоджувач (debugger) дозволяє зупинити виконання й подивитися значення змінних до наступного оператора. Спочатку відтворіть помилку на короткому наборі даних. Потім поставте точку зупинки (breakpoint) на рядку перед підозрілим обчисленням, клацнувши поле ліворуч від номера рядка, та запустіть Debug (Shift+F9). Рядок, підсвічений при зупинці, ще не виконаний.
Основні дії стандартної розкладки Windows: Step Over (F8) виконує рядок без входу у викликану функцію; Step Into (F7) переходить до її тіла; Step Out (Shift+F8) продовжує до повернення з поточного виклику; Resume (F9) – до наступної зупинки. Назви та клавіші перевіряйте в меню своєї розкладки PyCharm: https://www.jetbrains.com/help/pycharm/debugging-code.html.
Приклад 4. Середній бал із логічною помилкою
У наступному коді навмисно неправильний знаменник. Збережіть файл як average.py. Список scores містить чотири числа; sum обчислює їх суму, len – кількість. Програма друкує число, а не traceback, тому проста перевірка «запустилося» недостатня.
py
def average(scores: list[int]) -> float:
if not scores:
raise ValueError("список балів порожній")
total = 0
for score in scores:
total += score
return total / (len(scores) - 1) # Навмисна помилка.
scores = [60, 70, 80, 90]
print(f"Середній бал: {average(scores):.2f}")Середній бал: 100.00Очікуваний результат: (60 + 70 + 80 + 90) / 4 = 75. Поставте зупинку на return. У змінних має бути total = 300, а len(scores) = 4. Отже, накопичення правильне, проблема в останньому діленні. Після заміни знаменника на len(scores) отримаємо Середній бал: 75.00. Для одного бала виправлена функція повертає сам бал, стара дає ZeroDivisionError.
Знімок екрана
average.py: total = 300; scores містить чотири числа.
Рис. 4.5. Зупинка перед обчисленням середнього бала.
У панелі кадрів (Frames) можна обрати виклик і побачити його локальні змінні (Variables або Threads & Variables, залежно від версії). Спостереження (Watches) зберігають вирази для повторного перегляду, наприклад len(scores). Evaluate Expression (Alt+F8) обчислює введений вираз у поточному кадрі. Введіть sum(scores) / len(scores) і порівняйте з результатом програми. Не викликайте в цьому вікні функції, які змінюють дані: спостереження може саме вплинути на помилку.
Знімок екрана
Evaluate Expression: sum(scores) / len(scores) → 75.0.
Рис. 4.6. Незалежна перевірка формули у поточному кадрі.
У довгому циклі потрібна умовна точка зупинки: через контекстне меню точки задайте Condition, наприклад score == 80. Для циклу з індексом i може бути умова i == 7; вона має використовувати ім’я, яке вже існує в цьому кадрі. Якщо потрібно лише стежити за значеннями, вимкніть Suspend та ввімкніть Log evaluated expression. Так програма продовжить роботу й залишить запис.
Знімок екрана
Condition: score == 80; Suspend увімкнено.
Рис. 4.7. Умовна зупинка на потрібному значенні циклу.
Точка зупинки на винятку дозволяє знайти місце підняття навіть тоді, коли пізніше помилку буде перехоплено. Відкрийте Run → View Breakpoints (Ctrl+Shift+F8), додайте Python Exception Breakpoint для ZeroDivisionError і перевірте стару функцію на одному балі. Параметри зупинки при піднятті та необробленому завершенні залежать від обраного налагоджувача; орієнтуйтеся на фактичні підписи вашої версії, а не на колір піктограми.
Знімок екрана
View Breakpoints; додати Python Exception Breakpoint.
Рис. 4.8. Зупинка на ZeroDivisionError до обробки помилки.
Налагоджувач pdb і методика пошуку помилок
Вбудований модуль pdb працює в терміналі. Для того самого файла виконайте python -m pdb average.py. Команда l показує текст біля поточного рядка, n виконує наступний рядок, s входить у функцію, c продовжує роботу, p expression друкує значення, w показує стек, q завершує налагодження. Команда b 7 ставить точку зупинки на рядку 7 наведеного файла. Довідка: https://docs.python.org/3.14/library/pdb.html.
Після запуску введіть b 7, потім c. Виконання зупиниться перед неправильним return; p total покаже 300, p len(scores) – 4, а p total / len(scores) – 75.0. Це ті самі спостереження, що й у PyCharm. Номери рядків мають відповідати вашому файлу, якщо ви додали коментарі або порожні рядки. Виклик breakpoint() безпосередньо в програмі за стандартних налаштувань теж відкриває pdb; перед здаванням приберіть його.
Знімок екрана
b 7; c; p total; p len(scores); p total / len(scores); q.
Рис. 4.9. Перевірка змінних засобами pdb.
Пошук логічної помилки складається з чотирьох кроків. Спочатку відтворіть її та запишіть очікуваний результат. Потім локалізуйте перший неправильний стан, порівнюючи проміжні значення. Сформулюйте гіпотезу, наприклад «знаменник на одиницю менший». Нарешті перевірте її найменшою зміною та повторіть контрольні приклади. Одночасна зміна багатьох формул не показує, яка саме виправила збій.
Для середнього бала перевірте чотири бали, один бал, усі однакові бали й порожній список. Перші три випадки повинні дати правильні середні, останній – явний ValueError. Після виправлення залиште ці дані в таблиці перевірок: вони фіксують знайдену причину.
Типові помилки
- Голий
except:перехоплює навітьKeyboardInterruptіSystemExit. Визначте очікуваний тип і залиште можливість зупинити програму. - Великий
tryприховує джерело збою. Захищайте найменшу операцію, для якої є конкретний спосіб відновлення. - Загальний обробник перед конкретним робить останній недосяжним. Розташуйте їх від спеціального типу до базового.
except: passперетворює відмову на удаваний успіх. Поясніть відмову або повторно підніміть виняток.returnуfinallyможе знищити результат чи приховати виняток. Використовуйте цей блок лише для завершальних дій.assertдля введення зникає з-O. Межі даних перевіряйте явно.- Налагодження на одному вдалому прикладі не перевіряє алгоритм. Додайте межі, неправильний формат, відмову й повтор після відмови.