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?
Сообщение читается сверху вниз:
File "prices.py", line 1— файл и номер строки, где парсер остановился.- Копия этой строки.
- Каретки
^— фрагмент, который парсер не смог встроить в грамматику. Здесь подчеркнуты два соседних значения без запятой между ними. - Последняя строка — тип ошибки и подсказка.
Обратите внимание: 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. На старой версии такой код не разберется.
Если ошибку не видно: порядок поиска
- Прочитайте последнюю строку сообщения целиком — подсказка вроде
expected ':'часто сразу называет причину. - Посмотрите на строку из сообщения и на одну-две строки выше: незакрытая скобка или кавычка «переносит» ошибку вниз.
- Проверьте, что запускаете нужный файл и нужную версию:
python --version, путь к файлу в первой строке сообщения. - Проверьте файл без запуска:
python -m py_compile app.py. Если синтаксис в порядке, команда ничего не выводит; если нет — печатает то же сообщение SyntaxError (для IndentationError — одной строкой видаSorry: IndentationError: ...). - Если строка выглядит правильной, перепечатайте ее вручную: так уходят невидимые символы.
- Большой файл — делите пополам: закомментируйте половину и проверьте снова. Парсер сообщает только о первой найденной синтаксической ошибке, после ее исправления может появиться следующая.
Предупредить большинство таких ошибок помогает редактор с подсветкой синтаксиса и парных скобок (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+".
Можно ли выключить проверку синтаксиса и выполнить часть файла?
Нет. Файл разбирается целиком до запуска. Если нужно выполнить рабочую часть, вынесите ее в отдельный файл или исправьте ошибку.



