БэкендPython

SyntaxError: invalid syntax в Python: как найти пропущенную скобку, кавычку или двоеточие

Пошагово разбираем SyntaxError: invalid syntax в Python и находим незакрытые скобки, кавычки, пропущенные двоеточия и ошибку строкой выше.

Кодик

Автор

6 мин чтения

SyntaxError: invalid syntax означает, что Python не смог разобрать текст программы. Сначала смотрите на строку и указатель в сообщении, затем обязательно проверяйте предыдущую строку. Чаще всего причина укладывается в четыре проверки: закрыты ли скобки и кавычки, стоит ли двоеточие после составной конструкции, не пропущен ли оператор и не вставлено ли русское типографское обозначение вместо символа Python.

В отличие от обычного исключения, синтаксическая ошибка возникает до выполнения программы. Поэтому добавление try и except не поможет: интерпретатор ещё не смог построить корректную программу. Полезная стратегия состоит не в том, чтобы переписывать весь файл, а в том, чтобы уменьшить область поиска до одной или двух строк и проверить их по фиксированному порядку.

1Координата

Файл, номер строки и указатель показывают место, где разбор перестал сходиться.

2Контекст

Причина нередко находится строкой выше: там могла остаться открытая скобка или кавычка.

3Проверка

После одной правки сохраните файл и снова запустите ту же команду.

Что именно сообщает SyntaxError

Сообщение содержит имя файла, номер строки, фрагмент исходного кода и указатель. В современных версиях Python указатель может охватывать часть выражения, но это всё равно место обнаружения, а не гарантированное место причины. Парсер читает программу слева направо. Если предыдущая строка оставила выражение незавершённым, несоответствие обнаружится только на следующем токене.

price = 900
if price > 500
    print('Скидка доступна')

# File "shop.py", line 2
#   if price > 500
#                  ^
# SyntaxError: expected ':'
Часть сообщенияЧто она даётКак действовать
File "shop.py"Файл, который разбирал PythonУбедиться, что открыт и сохранён именно он
line 2Строка обнаружения проблемыПроверить её и строку выше
Указатель ^Позиция, где выражение перестало быть допустимымПосмотреть на символ перед указателем
expected ":"Конкретное ожидание парсераДобавить двоеточие после условия
invalid syntaxОбщая формулировкаПроверить скобки, строки и операторы

Анатомия сообщения SyntaxError в Python с номером строки и указателем
Сообщение даёт координату обнаружения, а проверка строки выше помогает найти первопричину.

Строка из сообщения не всегда виновата. Если указатель стоит в начале новой строки, поднимитесь выше и найдите незакрытый символ. Особенно часто это случается после длинного вызова функции, списка, словаря или f-строки. Исправляйте только после того, как сможете назвать конкретную незакрытую пару.

Пять проверок от самой частой к редкой

Маршрут поиска за две минуты
  1. Сохраните файл и повторите команду запуска, чтобы сообщение соответствовало текущему коду.
  2. Проверьте круглые, квадратные и фигурные скобки на строке и строкой выше.
  3. Проверьте парность одинарных и двойных кавычек, включая строки внутри f-строк.
  4. Найдите if, for, while, def, class, try или with без двоеточия.
  5. Проверьте, есть ли оператор между значениями: total + tax, а не total tax.
  6. Если причина не видна, временно закомментируйте половину выражения и снова выполните проверку.

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

# Было: закрывающая скобка потеряна
message = ('Заказ принят'
print(message)

# Стало
message = ('Заказ принят')
print(message)
# Заказ принят

Порядок поиска пропущенной скобки кавычки и двоеточия в Python
Идите от частых парных символов к редким невидимым знакам, не меняя всё сразу.

Цель проверки не угадать, а сузить место ошибки

После исправления синтаксиса файл должен хотя бы компилироваться. Запустите python -m py_compile shop.py: отсутствие вывода и код завершения 0 означают, что синтаксический разбор прошёл. Логические ошибки эта команда не ищет, поэтому затем нужен обычный запуск программы.

Как отличить скобку, кавычку, двоеточие и отступ

Формулировка помогает выбрать первую гипотезу. unterminated string literal почти прямо указывает на незакрытую строку. was never closed называет открывающую скобку. expected ":" относится к заголовку блока. А IndentationError является отдельным подклассом SyntaxError и говорит уже о структуре отступов.

СообщениеТипичная причинаМинимальная правка
"(" was never closedНет закрывающей круглой скобкиНайти пару, не добавлять скобку вслепую в конец файла
unterminated string literalНет второй кавычки или строка разорвана переводомЗакрыть строку тем же видом кавычки
expected ":"Нет двоеточия после заголовка блокаПоставить : перед переводом строки
invalid characterВставлен типографский или невидимый символПерепечатать оператор с клавиатуры
IndentationErrorНеверный уровень отступаВыровнять блок, обычно четырьмя пробелами
user = 'Мира'
items = ['книга', 'ручка']

if items:
    print(f'{user}: {len(items)} товара')

# Мира: 2 товара

Карта сообщений SyntaxError и типичных причин
Точная формулировка сокращает список гипотез до одного типа конструкции.

Не меняйте кавычки во всём файле. Одинарные и двойные кавычки в Python равноправны. Ошибка появляется из-за непарности или из-за кавычки внутри строки. Для текста с апострофом выберите другой внешний тип либо экранируйте символ, но не запускайте массовую замену без необходимости.

Почему случайные исправления делают ситуацию хуже

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

Добавлять скобку в конец файла

Баланс может формально сойтись, но изменится смысл большого выражения. Найдите конкретную открывающую скобку.

Ставить except вокруг кода

SyntaxError возникает до выполнения, поэтому обработчик не может перехватить её.

Править строку только по номеру

Проверьте предыдущую строку и символ перед указателем. Там часто начинается незавершённая конструкция.

Игнорировать сохранение файла

Терминал может запускать старую версию. Сверьте имя файла и выполните сохранение перед повтором.

Одна итерация должна отвечать на один вопрос

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

Финальная проверка исправленного файла

После успешной компиляции запустите программу на обычных данных и на одном граничном случае. Синтаксически корректный код ещё может содержать NameError, TypeError или неверную ветку условия. Разделяйте этапы: сначала программа должна читаться интерпретатором, затем выполняться, затем давать ожидаемый результат.

Чек-лист перед закрытием ошибки
  1. Сохранён именно тот файл, который указан в сообщении.
  2. Команда python -m py_compile имя_файла.py завершается без текста ошибки.
  3. Все скобки и кавычки имеют осмысленные пары.
  4. Каждый заголовок блока заканчивается двоеточием.
  5. Отступы внутри блока одинаковы и набраны пробелами.
  6. Обычный запуск показывает ожидаемый результат на исходных данных.
Форматтер полезен после восстановления синтаксиса. Большинство форматтеров не смогут обработать файл с незавершённой конструкцией. Сначала добейтесь успешного синтаксического разбора, затем применяйте автоматическое форматирование и сравнивайте поведение программы.
Короткие ответы
Почему указатель стоит не там, где пропущена скобка?

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

Можно ли перехватить SyntaxError через try except?

Не в том же неверном файле: код не начнёт выполняться. Синтаксические ошибки можно ловить при отдельном вызове compile или eval, но это другой сценарий.

Что означает expected двоеточие?

Python ожидал двоеточие после заголовка составной конструкции, например if, for, def или class.

Почему после правки появилась новая ошибка?

Первая ошибка могла скрывать следующую. Исправляйте сообщения сверху вниз по одному и каждый раз запускайте проверку заново.

Как быстро проверить синтаксис без запуска программы?

Выполните python -m py_compile файл.py. Команда проверит разбор файла, но не подтвердит правильность логики.

Закрепите поиск синтаксических ошибок на коротких программах

Потренируйтесь в курсе Python: намеренно удалите скобку, кавычку и двоеточие из небольшого примера, а затем восстановите их по сообщению. Для ошибок с отступами используйте разбор IndentationError.

Когда файл уже запускается, переходите к общей схеме из статьи про 15 ошибок новичков и инструкции по запуску первого Python-скрипта. В Кодике удобно хранить минимальный пример и проверять одну гипотезу за раз.