Что такое SyntaxError в Python
SyntaxError в Python — это сигнал, что в тексте программы нарушена грамматика языка, поэтому не выполнится ни одна строка. Даже print на первой строке промолчит, если ошибка спряталась в десятой.
Так происходит потому, что Python сначала читает весь файл целиком и переводит его во внутреннее представление, а уже потом выполняет. На этапе чтения он проверяет только форму: закрыты ли скобки, стоят ли двоеточия, нет ли слов в неожиданных местах. Смысл программы на этом шаге никто не проверяет. Поэтому синтаксическая ошибка отличается от остальных: она возникает до запуска, а NameError или деление на ноль — во время работы. Правила грамматики языка подробно описаны в официальной документации Python[1], но школьнику хватит пяти типичных случаев, которые мы разберём ниже.
В редакторе над статьёй лежит программа с двумя такими ошибками. Нажмите «▶ Запустить», прочитайте сообщение в окне «Вывод» и подсказку на русском под ним. Исправьте первую ошибку, запустите снова — и Python покажет вторую. Он всегда сообщает только об одной синтаксической проблеме за раз.
Как читать сообщение и стрелку ^
Сообщение о синтаксической ошибке состоит из 4 частей: имя файла и номер строки, сама строка кода, стрелка ^ под подозрительным местом и последняя строка с типом ошибки и пояснением.
chislo = 8
if chislo % 2 == 0
print("Чётное")
File "main.py", line 2
if chislo % 2 == 0
^
SyntaxError: expected ':'
Читать лучше снизу вверх. Последняя строка говорит главное: тип — SyntaxError, пояснение — «ожидалось двоеточие». Строкой выше стоит стрелка: она показывает позицию, где Python понял, что дальше читать нельзя. Ещё выше — номер строки. Здесь всё сходится: двоеточие забыто в конце второй строки, туда и указывает стрелка. Исправленный вариант:
chislo = 8
if chislo % 2 == 0:
print("Чётное")
Стрелка не всегда стоит точно на виновнике. Она отмечает место, где Python заметил проблему, а не где её создали. Если скобку открыли на строке 3, а интерпретатор споткнулся на строке 5, номер в сообщении может оказаться неожиданным. Новые версии языка стали подробнее: вместо сухого «invalid syntax» они пишут «'(' was never closed» или «Perhaps you forgot a comma?». В редакторе на нашем сайте текст сообщения может слегка отличаться, но слово SyntaxError в нём будет всегда. Общая схема разбора любых сообщений есть в статье как читать ошибки Python.
Пять причин синтаксической ошибки: таблица
Почти все синтаксические ошибки новичка сводятся к 5 причинам. Таблица помогает узнать причину по тексту сообщения, а подробные примеры идут следом.
| Что пишет Python | Что случилось | Как исправить |
| '(' was never closed | Открыли круглую скобку и не закрыли | Поставьте «)» в конце вызова |
| unterminated string literal | У строки нет закрывающей кавычки | Закройте строку той же кавычкой, что открыли |
| expected ':' | Нет двоеточия после if, for, while, else, def | Допишите «:» в конце строки |
| Maybe you meant '==' … | В условии стоит «=» вместо сравнения | Замените на «==» |
| Perhaps you forgot a comma? | Между значениями в print или списке нет запятой | Разделите значения запятыми |
| invalid syntax | Опечатка в слове, лишний символ, ключевое слово вместо имени | Проверьте написание слов в строке и строке выше |
Последняя строка таблицы самая неприятная: «invalid syntax» говорит только о том, что что-то не так. Тут спасает внимательное чтение слева направо, буква за буквой.
Незакрытая скобка или кавычка
Незакрытая скобка — это самая частая причина, по которой SyntaxError в Python появляется в «неправильной» строке. Интерпретатор ждёт закрывающую скобку и продолжает читать следующие строки, пока не убедится, что её нет.
ball = int(input("Сколько очков? ")
print("Ты набрал", ball)
В первой строке открыто две скобки — у int и у input, — а закрыта одна. Скобки удобно считать вслух: «открыл, открыл, закрыл, закрыл». Число открывающих и закрывающих в одной команде должно совпадать. Правильно так:
ball = int(input("Сколько очков? "))
print("Ты набрал", ball)
С кавычками похожая история. Строка начинается кавычкой и обязана закончиться такой же. Если открыть двойной, а закрыть одинарной, Python решит, что строка не закончилась вовсе, и напишет «unterminated string literal». Внутри строки можно использовать другой вид кавычек: print('Он сказал: "Привет"') — это законно. Руководство PEP 8 советует не делать строки длиннее 79 символов, и в коротких строках непарную скобку видно сразу. Хорошая привычка — сразу ставить пару: напечатали открывающую скобку, тут же закрывающую, и только потом пишите содержимое между ними.
Забытое двоеточие после if, for и def
Двоеточие в Python — это знак «дальше начинается блок». Его ставят в конце строк с if, elif, else, for, while, def, class, try и except.
for i in range(3)
print("Ура!")
Здесь Python прямо пишет «expected ':'» и ставит стрелку в конец первой строки. Это удобный случай: исправление занимает одну клавишу. Хуже, когда забыто двоеточие после else — его часто пропускают, потому что строка короткая и кажется законченной. Правило простое: если следующая строка сдвинута вправо, то в конце текущей должно стоять двоеточие. И наоборот: если двоеточие стоит, следующая строка обязана быть сдвинута, иначе вы получите уже ошибку отступа, которую разбирает статья про IndentationError и отступы.
Знак = вместо == в условии
Одиночный знак «=» в Python — это присваивание, а не сравнение. Чтобы проверить равенство в условии, нужно два знака: «==».
parol = input()
if parol = "черепаха":
print("Вход разрешён")
Новые версии Python догадываются, в чём дело, и пишут: «Maybe you meant '==' …». Исправленная строка: if parol == "черепаха":. Запомнить помогает фраза: «один знак — положи, два знака — сравни». Знаки сравнения тоже пишутся без пробела внутри: >=, <=, !=. Запись => или > = снова даст SyntaxError. Как устроены сравнения и составные условия, показано в уроке про условия if, elif и else; по федеральной образовательной программе основного общего образования ветвления и составные условия изучают в 8 классе[2], так что эта ошибка встречается у школьников постоянно.
Опечатки в ключевых словах и пропущенные запятые
Ключевые слова — это 35 зарезервированных слов языка вроде if, while, def, True. Опечатка в таком слове превращает его в непонятное имя, и Python не может разобрать строку.
whiel True:
print("Работаю")
Слово whiel Python воспринимает как имя переменной, за которым почему-то стоит True. Он пишет «invalid syntax» и ставит стрелку не на опечатку, а на следующее слово. Поэтому при сообщении без подсказки сначала проверяйте написание каждого слова в строке. Другая ловушка — ключевые слова нельзя использовать как имена переменных: class = 5 или for = 3 вызовут ошибку. Полный список есть на странице ключевые слова Python.
Пропущенная запятая — тоже частый гость. Запись print("Ответ:" otvet) выглядит почти правильно, но между строкой и переменной нет запятой. Python 3.10 и новее подсказывает: «Perhaps you forgot a comma?». То же бывает в списках: [1, 2 3]. Ещё один привет из прошлого — print "Привет" без скобок. Так писали во втором Python, который не поддерживается с 1 января 2020 года; в Python 3 это синтаксическая ошибка с подсказкой «Did you mean print(...)?».
Миф: «Если Python показал SyntaxError на строке 12, то в строках 1–11 всё в порядке». Это не подтверждается: незакрытая скобка на строке 9 часто проявляется только через несколько строк, поэтому смотрите и выше.
Как исправить SyntaxError в Python по шагам
Чтобы исправить SyntaxError в Python, пройдите 5 шагов: прочитайте последнюю строку сообщения, найдите номер строки, посмотрите на стрелку, проверьте строку выше и запустите код снова.
- Пояснение. Слова после двоеточия в последней строке часто прямо называют причину: «expected ':'», «was never closed».
- Номер строки. Откройте указанную строку; в редакторе номера видны слева.
- Стрелка ^. Посмотрите на символ над стрелкой и на символ прямо перед ним.
- Строка выше. Если в указанной строке всё чисто, проверьте скобки и кавычки на 1–2 строки выше.
- Повторный запуск. Исправьте одну проблему и запускайте: следующая ошибка покажется только после этого.
Этот порядок работает и в IDLE, и в редакторе на сайте. В IDLE при синтаксической ошибке выскакивает окно, а курсор встаёт рядом с проблемным местом — это та же стрелка, только нарисованная выделением.
Миф: «Синтаксическая ошибка значит, что программа придумана неправильно». На деле правила записи и логика — разные вещи: алгоритм может быть верным, а в строке просто не хватает скобки. Связи «синтаксис ломается у слабых программистов» не существует — так ошибаются все.
Когда стрелка ^ не поможет
Стрелка не поможет в нескольких случаях, когда причина лежит далеко от отмеченного места. Вот 4 ситуации, в которых нужно искать иначе.
- Скобка открыта на 3–5 строк раньше. Python дочитывает до конца файла и жалуется на последнюю строку; считайте скобки сверху вниз.
- В строке 2 вида кавычек. Строка открыта двойной, а закрыта одинарной кавычкой; стрелка стоит в начале строки, а не на кавычке.
- Код скопирован с 1 сайта с «умными» кавычками. Символы «“» и «”» похожи на «"», но Python их не принимает: перепечатайте кавычки с клавиатуры.
- Ошибка в 1-й строке сообщения — IndentationError. Это близкий родственник, но лечится выравниванием отступов, а не поиском скобок.
Чего делать нельзя
Нельзя чинить синтаксис наугад, стирая всё подряд: так легко сломать работающие части программы. Вот правила, которые экономят время.
- Нельзя исправлять несколько мест сразу вслепую — меняйте одно, запускайте, смотрите новое сообщение.
- Не стоит удалять строку целиком, если в ней не хватает скобки: вместе с ней пропадёт нужная команда.
- Не следует называть переменные ключевыми словами вроде
if,forилиclass: их список закреплён в документации Python. - Нельзя писать сравнение одним знаком «=» — в условии всегда «==».
- Не стоит копировать код из текстовых редакторов с автозаменой кавычек — они превращаются в «ёлочки» и «лапки».
- Не допускается писать по правилам Python 2:
printбез скобок в Python 3 не работает.
Если ошибок в программе много и непонятно, с какой начать, загляните в раздел все ошибки Python: там собраны разборы по каждому типу сообщений.
Источники
[1] The Python Tutorial (официальная документация Python 3). Python Software Foundation. — синтаксис и встроенные функции.
[2] Приказ Минпросвещения России от 18.05.2023 № 370 «Об утверждении федеральной образовательной программы основного общего образования». — информатика 7–9.
[3] van Rossum G., Warsaw B., Coghlan N. PEP 8 — Style Guide for Python Code. Python Software Foundation, 2001.
Вопросы и ответы
Почему SyntaxError в Python не даёт выполнить даже первую строку?
Интерпретатор сначала разбирает весь файл и только потом выполняет. Если разбор не удался, до выполнения дело не доходит, поэтому не появится ни одного print.
Чем эта ошибка отличается от NameError?
Синтаксис проверяется до запуска, а NameError возникает во время работы, когда Python встречает неизвестное имя. В программе с NameError строки до места ошибки успевают выполниться.
Что значит «invalid syntax» без подсказки?
Python нашёл непонятную конструкцию, но не смог угадать причину. Проверьте написание слов, запятые между значениями и не стоит ли ключевое слово на месте имени.
Помогает ли PEP 8 избегать таких ошибок?
Руководство PEP 8 описывает стиль, а не грамматику[3]. Но аккуратный код с пробелами вокруг операторов и короткими строками легче проверить глазами, и пропущенную скобку в нём видно быстрее.
Почему стрелка стоит на слове после опечатки?
Слово с опечаткой Python считает обычным именем — это законно. Ошибку он замечает на следующем слове, которое после имени стоять не может, туда и ставит стрелку.
Встречается ли такое на экзамене?
По материалам ФИПИ задание 16 ОГЭ по информатике выполняется на компьютере, и программу можно писать на Python, поэтому интерпретатор сразу покажет такую ошибку. Привычка проверять скобки и двоеточия до запуска экономит время на любой контрольной.