SyntaxError: invalid syntax в Python: причины и как исправить

SyntaxError: invalid syntax в Python: причины и как исправить Полезное

SyntaxError: invalid syntax — это ошибка, которую Python выдает еще до выполнения файла: интерпретатор не смог разобрать его текст по правилам грамматики языка, поэтому не выполняется ни одна строка этого файла. Чаще всего виноваты пропущенная запятая, двоеточие или скобка, опечатка в ключевом слове, = вместо == или текст, который вообще не является кодом Python 3 (команда pip, код Python 2, «умные» кавычки из документа).

Ниже — как читать сообщение, таблица частых причин с исправлениями и порядок поиска, если ошибка не находится с первого взгляда. Все примеры прогнаны 24.09.2026 на Python 3.14.7, для сравнения часть — на Python 3.9.6.

Три термина, которые путают

  • Синтаксическая ошибка (SyntaxError) — текст не является корректной программой. Обнаруживается при разборе (компиляции в байт-код), до выполнения.
  • Исключение времени выполнения (NameError, ZeroDivisionError, TypeError) — код разобран, запустился и упал на конкретной строке. Такие ошибки ловятся try/except.
  • IndentationError — частный случай SyntaxError (подкласс), связанный с отступами. Его причины и правила отступов — отдельная тема, здесь он упоминается только в таблице.

«invalid syntax» — самое общее сообщение; новые версии Python часто пишут точнее (expected ':', '(' was never closed), но это тот же SyntaxError с подсказкой.

Как читать сообщение об ошибке

Минимальный пример — словарь с пропущенной запятой:

prices = {"apple": 100 "pear": 120}
print(prices)

Результат запуска python prices.py на Python 3.14 (путь к файлу в первой строке у вас будет свой):

  File "prices.py", line 1
    prices = {"apple": 100 "pear": 120}
                       ^^^^^^^^^^
SyntaxError: invalid syntax. Perhaps you forgot a comma?

Сообщение читается сверху вниз:

  1. File "prices.py", line 1 — файл и номер строки, где парсер остановился.
  2. Копия этой строки.
  3. Каретки ^ — фрагмент, который парсер не смог встроить в грамматику. Здесь подчеркнуты два соседних значения без запятой между ними.
  4. Последняя строка — тип ошибки и подсказка.

Обратите внимание: print(prices) не выполнился, хотя он на следующей строке и сам по себе корректен. SyntaxError блокирует весь файл. Исправление — {"apple": 100, "pear": 120}.

Граница: «до запуска» относится к файлу с ошибкой. Если ошибка в модуле, который импортирует основной скрипт, строки скрипта до import успеют выполниться, а SyntaxError появится в момент импорта: трассировка начнется со строки import в основном файле и закончится строкой с ошибкой в модуле.

Важная граница: строка и каретка показывают место, где парсер понял, что дальше разобрать нельзя. Это не всегда место, где вы ошиблись. Если причина — незакрытая скобка или кавычка, реальная ошибка может быть на строке выше или на несколько строк раньше.

Частые причины и исправления

Что в коде Сообщение Как исправить
{"apple": 100 "pear": 120} invalid syntax. Perhaps you forgot a comma? поставить запятую между элементами
sum([1, 2, 3] '(' was never closed закрыть скобку
data = [1, 2, 3) closing parenthesis ')' does not match opening parenthesis '[' закрывать скобкой того же типа
name = 'Otus unterminated string literal (detected at line 1) закрыть кавычку
def greet(name) expected ':' двоеточие после def, if, for, while, class
if x = 5: invalid syntax. Maybe you meant '==' or ':=' instead of '='? сравнение — ==
whille True: invalid syntax. Did you mean 'while'? исправить опечатку в ключевом слове
class = "Python 101" invalid syntax не использовать ключевые слова как имена
break вне цикла 'break' outside loop break/continue — только внутри цикла
print "Hello" Missing parentheses in call to 'print'. Did you mean print(...)? в Python 3 print — функция: print("Hello")
pip install requests в файле или в >>> invalid syntax команду pip запускать в терминале, не в Python
print(“Hello”) invalid character '“' (U+201C) заменить типографские кавычки на "
тело for без отступа IndentationError: expected an indented block after 'for' statement on line 2 добавить отступ в тело блока

Скобки и кавычки: ошибка «уезжает» на другую строку

total = sum([1, 2, 3]
count = 3
print(total, count)

Python 3.14 указывает на настоящую причину:

  File "total.py", line 1
    total = sum([1, 2, 3]
               ^
SyntaxError: '(' was never closed

Тот же файл на Python 3.9.6 дает менее полезное сообщение — и на другой строке:

  File "total.py", line 2
    count = 3
    ^
SyntaxError: invalid syntax

Отсюда практическое правило: если строка из сообщения выглядит правильной, проверьте строку выше — обычно там не закрыта скобка или кавычка. Исправление: total = sum([1, 2, 3]).

Сравнение вместо присваивания

x = 5
if x = 5:
    print("five")
  File "compare.py", line 2
    if x = 5:
       ^^^^^
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?

Одиночный = — присваивание, в условии нужен ==. Оператор := подходит, только если нужно сохранить значение в переменную прямо в условии.

Не Python 3: команды терминала, код Python 2, кавычки из документа

Частые источники invalid syntax у новичков:

  • Команда терминала внутри Python. pip install requests, введенная после приглашения >>> или записанная в .py-файл, — это не код Python. Выйдите из интерпретатора (exit()) и выполните python -m pip install requests в терминале. Туда же относится скопированное с приглашением >>> print("hi"): символы >>> — часть интерфейса, не кода.
  • Код Python 2. print "Hello" Python 3 распознает и прямо подсказывает, что нужны скобки.
  • Типографские символы. Кавычки “ ” и неразрывный пробел (сообщение invalid non-printable character U+00A0) попадают в код при копировании из документов, мессенджеров и презентаций. Лечится перепечатыванием строки или поиском по символу в редакторе.

Отдельная ловушка — обработчик в стиле Python 2:

try:
    x = 1 / 0
except ZeroDivisionError, e:
    print(e)

На Python 3.9 это SyntaxError. На Python 3.14 — уже нет: теперь except A, B: без скобок означает «перехватить A или B», и e трактуется как второй тип исключения. Код запускается и падает во время выполнения (последняя строка трассировки):

NameError: name 'e' is not defined

Исправление для любой версии Python 3: except ZeroDivisionError as e:.

Почему try/except не перехватывает SyntaxError

try:
    print("start")
    x = = 1
except SyntaxError:
    print("caught")
  File "catch.py", line 3
    x = = 1
        ^
SyntaxError: invalid syntax

Не напечаталось ни start, ни caught: файл не прошел разбор, до выполнения блока try дело не дошло. Перехватить SyntaxError можно только для кода, который разбирается позже, во время работы программы: через compile(), exec(), eval(), ast.parse() или при импорте другого модуля.

source = "if x > 3\n    print(x)\n"
try:
    compile(source, "user_code.py", "exec")
except SyntaxError as err:
    print(type(err).__name__, "|", err.msg)
    print("строка:", err.lineno, "позиция:", err.offset)
    print("текст:", err.text.rstrip())

Вывод на Python 3.14:

SyntaxError | expected ':'
строка: 1 позиция: 9
текст: if x > 3

Версия Python меняет текст ошибки

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

Код Python 3.9.6 Python 3.14.7
незакрытая ( перед следующей строкой invalid syntax на следующей строке '(' was never closed на строке со скобкой
if x = 5: invalid syntax подсказка про == и :=
whille True: invalid syntax Did you mean 'while'?
f"Hi, {user["name"]}" f-string: unmatched '[' работает, печатает Hi, Ann
except ZeroDivisionError, e: invalid syntax запускается, NameError

Практический вывод: если код из статьи или ответа на форуме у автора работает, а у вас выдает SyntaxError, проверьте версию командой python --version. Кавычки того же типа внутри f-строки допускаются с Python 3.12, оператор match — с 3.10. На старой версии такой код не разберется.

Если ошибку не видно: порядок поиска

  1. Прочитайте последнюю строку сообщения целиком — подсказка вроде expected ':' часто сразу называет причину.
  2. Посмотрите на строку из сообщения и на одну-две строки выше: незакрытая скобка или кавычка «переносит» ошибку вниз.
  3. Проверьте, что запускаете нужный файл и нужную версию: python --version, путь к файлу в первой строке сообщения.
  4. Проверьте файл без запуска: python -m py_compile app.py. Если синтаксис в порядке, команда ничего не выводит; если нет — печатает то же сообщение SyntaxError (для IndentationError — одной строкой вида Sorry: IndentationError: ...).
  5. Если строка выглядит правильной, перепечатайте ее вручную: так уходят невидимые символы.
  6. Большой файл — делите пополам: закомментируйте половину и проверьте снова. Парсер сообщает только о первой найденной синтаксической ошибке, после ее исправления может появиться следующая.

Предупредить большинство таких ошибок помогает редактор с подсветкой синтаксиса и парных скобок (VS Code, PyCharm) и линтер вроде Ruff или flake8: они подчеркивают проблему до запуска.

Выводы

  • SyntaxError: invalid syntax означает, что Python не смог разобрать файл, поэтому не выполнилась ни одна его строка (для импортируемого модуля ошибка возникает в момент import).
  • Номер строки и каретка ^ показывают, где парсер остановился; при незакрытой скобке или кавычке причина обычно выше.
  • Главные причины: пропущенные запятая, двоеточие или скобка, = вместо ==, опечатка в ключевом слове, команда терминала или код Python 2 в файле.
  • try/except в том же файле SyntaxError не ловит; перехватить можно только ошибку в коде, разбираемом через compile(), exec() или импорт.
  • Текст сообщения зависит от версии: Python 3.14 подсказывает точнее, чем 3.9, а часть кода валидна только в новых версиях.

Где применяется / связь с практикой

Освойте тему на практике

Умение быстро читать сообщения интерпретатора — базовый навык, который экономит время на каждом учебном задании и в рабочем коде: сначала SyntaxError, затем исключения времени выполнения и трассировки стека. Если вы начинаете с Python и хотите разобрать синтаксис, типы данных, функции и отладку системно, с проверкой домашних заданий, посмотрите программу курса «Python-разработчик. Базовый уровень». Разобрать отдельные темы бесплатно можно на открытых уроках Otus.

FAQ

Почему в Jupyter Notebook SyntaxError ломает только одну ячейку?
Каждая ячейка разбирается и выполняется отдельно. Ячейка с синтаксической ошибкой не выполнится целиком, а переменные из ранее выполненных ячеек останутся доступны.

Чем SyntaxError отличается от SyntaxWarning?
SyntaxWarning — предупреждение, код все равно запускается. Пример на Python 3.14: строка "\d+" дает предупреждение "\d" is an invalid escape sequence, но программа работает; для регулярных выражений используйте сырые строки r"\d+".

Можно ли выключить проверку синтаксиса и выполнить часть файла?
Нет. Файл разбирается целиком до запуска. Если нужно выполнить рабочую часть, вынесите ее в отдельный файл или исправьте ошибку.

OTUS Журнал
Бесплатные открытые уроки (поп-ап)