Добавить в корзинуПозвонить
Найти в Дзене
Герман Геншин

5 коварных ловушек Python, которые портят ваш код — и как побороть их в одну минуту!

Ошибки в Python поджидают на каждом шагу, вне зависимости от вашего опыта. Встретиться с ними — вопрос времени. Иногда всё понятно с первого взгляда, но бывает, что причина бага становится настоящей головоломкой. Я решил разобрать самые частые ошибки — чтобы вы не тратили часы на поиски их смысла и быстро находили решение. Только начинаете изучать Python? Или уже писали на C/C++ или Java? Готовьтесь: эта ошибка встретится чаще других. В отличие от этих языков, где блоки кода ограничиваются фигурными скобками, в Python решает всё отступ. Блок — это несколько строк, которые объединяют тело функции, условия или цикла. Внутри одного блока строки всегда должны иметь одинаковый отступ. Стоит ошибиться на один пробел — Python «думает», что вы начинаете новый блок. Любая неразбериха с отступами сразу вызывает IndentationError. Часто такая проблема появляется после копирования кода между разными редакторами: табы и пробелы отображаются по-разному, в итоге структура кода ломается. Поставили не
Оглавление

Ошибки в Python поджидают на каждом шагу, вне зависимости от вашего опыта. Встретиться с ними — вопрос времени. Иногда всё понятно с первого взгляда, но бывает, что причина бага становится настоящей головоломкой. Я решил разобрать самые частые ошибки — чтобы вы не тратили часы на поиски их смысла и быстро находили решение.

5 IndentationError

Только начинаете изучать Python? Или уже писали на C/C++ или Java? Готовьтесь: эта ошибка встретится чаще других. В отличие от этих языков, где блоки кода ограничиваются фигурными скобками, в Python решает всё отступ. Блок — это несколько строк, которые объединяют тело функции, условия или цикла.

Внутри одного блока строки всегда должны иметь одинаковый отступ. Стоит ошибиться на один пробел — Python «думает», что вы начинаете новый блок. Любая неразбериха с отступами сразу вызывает IndentationError.

Часто такая проблема появляется после копирования кода между разными редакторами: табы и пробелы отображаются по-разному, в итоге структура кода ломается.

Поставили не тот отступ? При запуске сразу получите IndentationError. Лекарство одно — аккуратно выровнять все строки блока по одному отступу.

Ещё один типичный сбой — смешивание табуляций и пробелов. Одни редакторы ставят четыре пробела, другие — таб. Если в одном блоке оказались и те, и другие — ловите ошибку. Самое коварное: визуально иногда не понять, где пробелы, а где табы.

4 SyntaxError

У каждого языка программирования свой набор правил, то есть синтаксис. Нарушили правило — получите синтаксическую ошибку.

В Python SyntaxError появляется, если интерпретатор встречает строку, не совместимую с правилами языка. Проще говоря — Python не догадался, чего вы хотели, и даже не начнёт выполнение кода. Вот классические примеры, из-за чего возникает ошибка:

-2

Хорошая новость: интерпретатор обычно указывает, в какой строке и в каком месте возникла ошибка. Иногда подсказка бывает не особо точной, но часто направление поиска очевидно. Большинство современных редакторов или IDE распознают ошибку ещё до запуска кода и подсказывают, как её починить.

3 IndexError

Python предлагает удобные структуры данных: списки, кортежи, множества. Мы постоянно обращаемся к элементам по номеру — индексу.

Допустим, у вас есть список numbers. Обратиться к элементу можно по его индексу. Всё отлично, пока не выходит за «границы» массива.

IndexError случается, если обратиться к элементу с несуществующим индексом. Напоминаю: индексы в Python начинаются с нуля, так что если у списка N элементов, максимальный индекс — N-1.

-3

Многие новички ловят ошибку «на единичку»: пытаются обратиться к индексу, которого нет в списке. Решение простое — всегда проверяйте длину списка перед доступом к элементам.

Часто ошибка появляется и тогда, когда меняете структуру списка прямо во время обхода — это тоже может привести к IndexError. Лучше избегайте изменений, пока проходите список циклом.

2 ValueError

В Python много типов данных. Мы постоянно передаём функции разные значения, и каждая функция ждёт определённый тип данных. Но она учитывает и смысл переданного значения.

Вот так возникает ValueError: функция получила аргумент с подходящим типом, но с неподходящим содержимым. Тип правильный, но само значение не устраивает функцию.

Чаще всего ошибка возникает при преобразовании типов:

К примеру, строку '10' можно без проблем преобразовать в число 10. Но если попробовать сделать то же самое с 'ten'...

-4

Получаем ValueError — потому что функция int() ожидает строку только из цифр. 'ten' ей не подойдёт. Аналогично — если, например, функция sqrt() ждёт положительное число, а ей дают отрицательное, возникнет ValueError.

Чаще всего с этой ошибкой сталкиваются при обработке пользовательского ввода: никогда не угадаешь, что введёт пользователь.

Лучший способ защититься от ValueError — оборачивать опасные операции в try-except и грамотно обрабатывать ошибки. Так программа не рухнет даже при самых неожиданных данных.

1 AttributeError

AttributeError появляется, когда вы пытались обратиться к свойству или методу, которого у объекта просто нет. По сути, вы просите объект сделать то, чего он не умеет.

Работая со строками, списками или своими классами, легко запутаться со свойствами разных объектов, особенно если менять типы на лету. Если вызвать несуществующий метод — Python сразу выдаст AttributeError.

Например, у строк нет метода push() — попытка его вызвать приведёт к ошибке. Вот ещё частый случай:

-5

Если попытаться обратиться к атрибуту 'name' у объекта типа NoneType — снова выйдет AttributeError. Чтобы не попасть в такую ловушку, всегда проверяйте тип объекта перед работой с его атрибутами или методами.

В помощь — встроенная функция dir(): она показывает все доступные методы и свойства конкретного объекта.

Python действительно прост для старта, но даже элементарные ошибки могут сильно запутать. Теперь, зная об этих ловушках, вы сможете быстро их замечать — и писать чистый, красивый код без лишних нервов.

Если вам понравилась эта статья, подпишитесь, чтобы не пропустить еще много полезных статей!

Премиум подписка - это доступ к эксклюзивным материалам, чтение канала без рекламы, возможность предлагать темы для статей и даже заказывать индивидуальные обзоры/исследования по своим запросам!Подробнее о том, какие преимущества вы получите с премиум подпиской, можно узнать здесь

Также подписывайтесь на нас в: