SyntaxError: invalid syntax означает, что Python не смог разобрать текст программы. Сначала смотрите на строку и указатель в сообщении, затем обязательно проверяйте предыдущую строку. Чаще всего причина укладывается в четыре проверки: закрыты ли скобки и кавычки, стоит ли двоеточие после составной конструкции, не пропущен ли оператор и не вставлено ли русское типографское обозначение вместо символа Python.
В отличие от обычного исключения, синтаксическая ошибка возникает до выполнения программы. Поэтому добавление try и except не поможет: интерпретатор ещё не смог построить корректную программу. Полезная стратегия состоит не в том, чтобы переписывать весь файл, а в том, чтобы уменьшить область поиска до одной или двух строк и проверить их по фиксированному порядку.
Файл, номер строки и указатель показывают место, где разбор перестал сходиться.
Причина нередко находится строкой выше: там могла остаться открытая скобка или кавычка.
После одной правки сохраните файл и снова запустите ту же команду.
Что именно сообщает 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 | Общая формулировка | Проверить скобки, строки и операторы |

Сообщение даёт координату обнаружения, а проверка строки выше помогает найти первопричину.
Пять проверок от самой частой к редкой
- Сохраните файл и повторите команду запуска, чтобы сообщение соответствовало текущему коду.
- Проверьте круглые, квадратные и фигурные скобки на строке и строкой выше.
- Проверьте парность одинарных и двойных кавычек, включая строки внутри f-строк.
- Найдите
if,for,while,def,class,tryилиwithбез двоеточия. - Проверьте, есть ли оператор между значениями:
total + tax, а неtotal tax. - Если причина не видна, временно закомментируйте половину выражения и снова выполните проверку.
Удобнее искать не глазами по всему файлу, а слоями. Сначала парные символы, затем окончания составных строк, затем операторы и только после этого редкие случаи вроде типографских кавычек. Такой порядок важен: одна открытая скобка способна вызвать несколько вторичных подсказок, и правка последней из них не устранит первопричину.
# Было: закрывающая скобка потеряна
message = ('Заказ принят'
print(message)
# Стало
message = ('Заказ принят')
print(message)
# Заказ принят
Идите от частых парных символов к редким невидимым знакам, не меняя всё сразу.
После исправления синтаксиса файл должен хотя бы компилироваться. Запустите 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 товара
Точная формулировка сокращает список гипотез до одного типа конструкции.
Почему случайные исправления делают ситуацию хуже
После первой синтаксической ошибки Python может ещё не знать, как вы хотели продолжить конструкцию. Поэтому одно неверное место иногда маскирует следующее. Правильная тактика: исправить верхнюю ошибку, сохранить файл, снова запустить проверку и работать уже с новым первым сообщением. Так координаты всегда относятся к актуальному коду.
Баланс может формально сойтись, но изменится смысл большого выражения. Найдите конкретную открывающую скобку.
SyntaxError возникает до выполнения, поэтому обработчик не может перехватить её.
Проверьте предыдущую строку и символ перед указателем. Там часто начинается незавершённая конструкция.
Терминал может запускать старую версию. Сверьте имя файла и выполните сохранение перед повтором.
Если вы проверяли двоеточие, добавьте только его и повторите py_compile. Если сообщение исчезло, гипотеза подтверждена. Если координата сместилась, перед вами следующая независимая ошибка, а не доказательство того, что первая правка была бессмысленной.
Финальная проверка исправленного файла
После успешной компиляции запустите программу на обычных данных и на одном граничном случае. Синтаксически корректный код ещё может содержать NameError, TypeError или неверную ветку условия. Разделяйте этапы: сначала программа должна читаться интерпретатором, затем выполняться, затем давать ожидаемый результат.
- Сохранён именно тот файл, который указан в сообщении.
- Команда
python -m py_compile имя_файла.pyзавершается без текста ошибки. - Все скобки и кавычки имеют осмысленные пары.
- Каждый заголовок блока заканчивается двоеточием.
- Отступы внутри блока одинаковы и набраны пробелами.
- Обычный запуск показывает ожидаемый результат на исходных данных.
Почему указатель стоит не там, где пропущена скобка?
Он отмечает место, где парсер окончательно понял, что продолжение невозможно. Открывающая скобка могла остаться строкой выше.
Можно ли перехватить SyntaxError через try except?
Не в том же неверном файле: код не начнёт выполняться. Синтаксические ошибки можно ловить при отдельном вызове compile или eval, но это другой сценарий.
Что означает expected двоеточие?
Python ожидал двоеточие после заголовка составной конструкции, например if, for, def или class.
Почему после правки появилась новая ошибка?
Первая ошибка могла скрывать следующую. Исправляйте сообщения сверху вниз по одному и каждый раз запускайте проверку заново.
Как быстро проверить синтаксис без запуска программы?
Выполните python -m py_compile файл.py. Команда проверит разбор файла, но не подтвердит правильность логики.
Потренируйтесь в курсе Python: намеренно удалите скобку, кавычку и двоеточие из небольшого примера, а затем восстановите их по сообщению. Для ошибок с отступами используйте разбор IndentationError.
Когда файл уже запускается, переходите к общей схеме из статьи про 15 ошибок новичков и инструкции по запуску первого Python-скрипта. В Кодике удобно хранить минимальный пример и проверять одну гипотезу за раз.