Что означает syntaxerror invalid syntax
Что означает ошибка SyntaxError: invalid syntax
Когда Python не может разобраться в ваших командах
Ситуация: программист взял в работу математический проект — ему нужно написать код, который будет считать функции и выводить результаты. В задании написано:
«Пусть у нас есть функция f(x,y) = xy, которая перемножает два аргумента и возвращает полученное значение».
Программист садится и пишет код:
Но при выполнении такого кода компьютер выдаёт ошибку:
File «main.py», line 13
result = x y
^
❌ SyntaxError: invalid syntax
Почему так происходит: в каждом языке программирования есть свой синтаксис — правила написания и оформления команд. В Python тоже есть свой синтаксис, по которому для умножения нельзя просто поставить рядом две переменных, как в математике. Интерпретатор находит первую переменную и думает, что ему сейчас объяснят, что с ней делать. Но вместо этого он сразу находит вторую переменную. Интерпретатор не знает, как именно нужно их обработать, потому что у него нет правила «Если две переменные стоят рядом, их нужно перемножить». Поэтому интерпретатор останавливается и говорит, что у него лапки.
Что делать с ошибкой SyntaxError: invalid syntax
В нашем случае достаточно поставить звёздочку (знак умножения в Python) между переменными — это оператор умножения, который Python знает:
В общем случае найти источник ошибки SyntaxError: invalid syntax можно так:
Практика
Попробуйте найти ошибки в этих фрагментах кода:
Как чинить SyntaxError
SyntaxError — это ошибка, которая легко может ввести в ступор начинающего программиста. Стоит забыть одну запятую или не там поставить кавычку и Python наотрез откажется запускать программу. Что ещё хуже, по выводу в консоль сложно сообразить в чём дело. Выглядят сообщения страшно и непонятно. Что с этим делать — не ясно. Вот неполный список того, что можно встретить:
Работать будем с программой, которая выводит на экран список учеников. Её код выглядит немного громоздко и, возможно, непривычно. Если не всё написанное вам понятно, то не отчаивайтесь, чтению статьи это не помешает.
Ожидается примерно такой результат в консоли:
Но запуск программы приводит к совсем другому результату. Скрипт сломан:
Первое слово SyntaxError Яндекс не понял. Помогите ему и разделите слова пробелом:
Теория. Синтаксические ошибки
Программирование — это не магия, а Python — не волшебный шар. Он не умеет предсказывать будущее, у него нет доступа к секретным знаниями, это просто автомат, это программа. Узнайте как она работает, как ищет ошибки в коде, и тогда легко найдете эффективный способ отладки. Вся необходимая теория собрана в этом разделе, дочитайте до конца.
SyntaxError — это синтаксическая ошибка. Она случается очень рано, еще до того, как Python запустит программу. Вот что делает компьютер, когда вы запускаете скрипт командой python script.py :
Синтаксическая ошибка SyntaxError возникает на четвёртом этапе в момент, когда Python разбирает текст программы на понятные ему компоненты. Сложные выражения в коде он разбирает на простейшие инструкции. Вот пример кода и инструкции для него:
SyntaxError случается когда Python не смог разбить сложный код на простые инструкции. Зная это, вы можете вручную разбить код на инструкции, чтобы затем проверить каждую из них по отдельности. Ошибка прячется в одной из инструкций.
1. Найдите поломанное выражение
Этот шаг сэкономит вам кучу сил. Найдите в программе сломанный участок кода. Его вам предстоит разобрать на отдельные инструкции. Посмотрите на вывод программы в консоль:
Вторая строчка сообщает: File «script.py», line 9 — ошибка в файле script.py на девятой строчке. Но эта строка является частью более сложного выражения, посмотрите на него целиком:
2. Разбейте выражение на инструкции
В прошлых шагах вы узнали что сломан этот фрагмент кода:
Разберите его на инструкции:
Так выделил бы инструкции программист, но вот Python сделать так не смог и сломался. Пора выяснить на какой инструкции нашла коса на камень.
Теперь ваша задача переписать код так, чтобы в каждой строке программы исполнялось не более одной инструкции из списка выше. Так вы сможете тестировать их по отдельности и облегчите себе задачу. Так выглядит отделение инструкции по созданию строки:
Сразу запустите код, проверьте что ошибка осталась на прежнему месте. Приступайте ко второй инструкции:
Скорее всего, Python не распознал вызов функции. Проверьте это, избавьтесь от последней инструкции — от создания переменной label :
3. Проверьте синтаксис вызова функции
Теперь вы знаете что проблема в коде, вызывающем функцию. Можно помедитировать еще немного над кодом программы, пройтись по нему зорким взглядом еще разок в надежде на лучшее. А можно поискать в сети примеры кода для сравнения.
Запросите у Яндекса статьи по фразе “Python синтаксис функции”, а в них поищите код, похожий на вызов format и сравните. Вот одна из первых статей в поисковой выдаче:
Уверен, теперь вы нашли ошибку. Победа!
Попробуйте бесплатные уроки по Python
Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.
Переходите на страницу учебных модулей «Девмана» и выбирайте тему.
Неверный синтаксис в Python: общие причины SyntaxError
Python известен своим простым синтаксисом. Однако, когда вы изучаете Python впервые или когда вы пришли к Python, имея солидный опыт работы с другим языком программирования, вы можете столкнуться с некоторыми вещами, которые Python не допускает. Если вы когда-либо получали ошибку SyntaxError при попытке запустить код Python. Здесь вы увидите распространенные примеры недопустимого синтаксиса в Python и узнаете, как решать эти проблемы.
К концу урока вы сможете:
Содержание
Ошибочный синтаксис в Python
Когда вы запускаете свой код Python, интерпретатор сначала анализирует его, чтобы преобразовать в байт-код Python, который затем выполняет. Интерпретатор обнаружит любой недопустимый синтаксис в Python на этом первом этапе выполнения программы, также известном как этап синтаксического анализа. Если интерпретатор не может успешно проанализировать ваш код Python, то это означает, что где-то в коде вы использовали неверный синтаксис. Интерпретатор попытается показать вам, где произошла эта ошибка.
Когда вы впервые изучаете Python, может быть неприятно получить SyntaxError. Python попытается помочь вам определить неправильный синтаксис в вашем коде, но трассировка, которую он предоставляет, может немного сбивать с толку. Иногда код, на который он указывает, совершенно нормален.
Примечание. Если ваш код синтаксически правильный, вы можете получить другие исключения, которые не являются SyntaxError. Чтобы узнать больше о других исключениях Python и о том, как с ними обращаться, ознакомьтесь со статьей «Исключения Python: Введение».
Исключение SyntaxError и трассировка
Когда интерпретатор обнаруживает недопустимый синтаксис в коде Python, он вызывает исключение SyntaxError и предоставляет обратную трассировку с некоторой полезной информацией, которая поможет вам отладить ошибку. Вот код, который содержит недопустимый синтаксис в Python:
Обратите внимание, что сообщение трассировки обнаруживает ошибку в строке 5, а не в строке 4. Интерпретатор Python пытается указать, где находится недопустимый синтаксис. Однако на самом деле он может указывать только на то, где впервые заметил проблему. Когда вы получаете трассировку SyntaxError и код, на который указывает трассировка, выглядит нормально,тогда вы захотите начать движение назад по коду, пока не сможете определить, что не так.
В приведенном выше примере нет проблем с пропуском запятой, в зависимости от того, что идет после нее. Например, нет проблем с пропущенной запятой после слова michael в строке 5. Но как только интерпретатор сталкивается с чем-то, что не имеет смысла, он может указать вам только на первое, что он обнаружит, чего он не может понять.
Примечание. В этом руководстве предполагается, что вы знакомы с основами трассировки Python. Чтобы узнать больше о трассировке Python и о том, как ее читать, ознакомьтесь с разделами «Понимание трассировки Python» и «Получение максимальной отдачи от трассировки Python».
Есть несколько элементов трассировки SyntaxError, которые могут помочь вам определить, где в вашем коде находится недопустимый синтаксис:
В приведенном выше примере имя файла было theofficefacts.py, номер строки был 5, а курсор указывал на закрывающую кавычку словарного ключа michael. Трассировка SyntaxError может не указывать на настоящую проблему, но она укажет на первое место, где интерпретатор не может понять синтаксис.
Есть два других исключения, которые могут вызвать Python. Они эквивалентны SyntaxError, но имеют разные имена:
Оба эти исключения наследуются от класса SyntaxError, но это особые случаи, когда речь идет об отступах. Ошибка IndentationError возникает, когда уровни отступа вашего кода не совпадают. Ошибка TabError возникает, когда в вашем коде используются как табуляции, так и пробелы в одном файле. Вы подробнее рассмотрите эти исключения в следующем разделе.
Общие проблемы синтаксиса
Когда вы впервые сталкиваетесь с SyntaxError, полезно знать, почему возникла проблема и что вы можете сделать, чтобы исправить недопустимый синтаксис в вашем коде Python. В разделах ниже вы увидите некоторые из наиболее распространенных причин, по которым может возникать SyntaxError, и способы их устранения.
Неправильное использование оператора присваивания (=)
В Python есть несколько случаев, когда вы не можете назначать объекты. Некоторые примеры присваиваются литералам и вызовам функций. В блоке кода ниже вы можете увидеть несколько примеров, которые пытаются это сделать, и результирующие трассировки SyntaxError:
Второй и третий примеры пытаются присвоить литералам строку и целое число. То же правило верно и для других буквальных значений. Снова,сообщения трассировки указывают, что проблема возникает при попытке присвоить значение литералу.
Примечание. В приведенных выше примерах отсутствует повторяющаяся строка кода и курсор (^), указывающий на проблему в трассировке. Исключение и трассировка, которые вы видите, будут другими, когда вы находитесь в REPL и пытаетесь выполнить этот код из файла. Если бы этот код был в файле, вы бы получили повторяющуюся строку кода и курсор, указывающий на проблему, как вы видели в других случаях в этом уроке.
Скорее всего, вы не собираетесь присвоить значение литералу или вызову функции. Например, это может произойти, если вы случайно оставите лишний знак равенства (=), который превратит присвоение в сравнение. Сравнение, как вы можете видеть ниже, было бы справедливым:
В большинстве случаев, когда Python сообщает вам, что вы назначаете что-то, что не может быть назначено, вы сначала можете проверить, чтобы убедиться, что оператор не должен быть логическим выражением. Вы также можете столкнуться с этой проблемой, когда пытаетесь присвоить значение ключевому слову Python, о чем вы узнаете в следующем разделе.
Ошибочное написание, отсутствие или неправильное использование ключевых слов Python
Ключевые слова Python — это набор защищенных слов, которые имеют особое значение в Python. Это слова, которые нельзя использовать в качестве идентификаторов, переменных или имен функций в коде. Они являются частью языка и могут использоваться только в том контексте, который позволяет Python.
Есть три распространенных способа ошибочного использования ключевых слов:
Если вы неправильно написали ключевое слово в коде Python, вы получите ошибку SyntaxError. Например, вот что произойдет, если вы неправильно напишете ключевое слово для:
В сообщении написано SyntaxError: недопустимый синтаксис, но это не очень помогает. Отслеживание указывает на первое место, где Python мог обнаружить, что что-то не так. Чтобы исправить эту ошибку, убедитесь, что все ключевые слова Python написаны правильно.
Еще одна распространенная проблема с ключевыми словами — это когда вы их вообще пропускаете:
Вы также можете неправильно использовать защищенное ключевое слово Python. Помните, что ключевые слова разрешено использовать только в определенных ситуациях. Если вы используете их неправильно, в вашем коде Python будет недопустимый синтаксис. Типичный пример этого — использование continue или break вне цикла. Это легко может произойти во время разработки, когда вы что-то реализуете и случайно перемещаете логику за пределы цикла:
Здесь Python отлично сообщает вам, что именно не так. Сообщения ‘break’ outside loop и ‘continue’ not properly in loop помогают точно понять, что делать. Если бы этот код находился в файле, то у Python также была бы каретка, указывающая прямо на неправильно использованное ключевое слово. Другой пример: вы пытаетесь назначить ключевое слово Python переменной или использовать ключевое слово для определения функции:
Когда вы пытаетесь назначить значение для передачи или когда вы пытаетесь определить новую функцию с именем pass, вы получите SyntaxError и снова увидите сообщение invalid syntax.
Исправить этот тип недопустимого синтаксиса в коде Python может быть немного сложнее, потому что код выглядит нормально снаружи. Если ваш код выглядит хорошо, но вы все еще получаете SyntaxError, тогда вы можете проверить имя переменной или имя функции, которое вы хотите использовать, в списке ключевых слов для версии Python, которую вы используете.
Список защищенных ключевых слов менялся с каждой новой версией Python. Например, в Python 3.6 вы можете использовать await в качестве имени переменной или имени функции, но в Python 3.7 это слово было добавлено в список ключевых слов. Теперь, если вы попытаетесь использовать await в качестве имени переменной или функции, это вызовет ошибку SyntaxError, если ваш код предназначен для Python 3.7 или новее.
print — это ключевое слово в Python 2, поэтому вы не можете присвоить ему значение. Однако в Python 3 это встроенная функция, которой можно присвоить значения.
Вы можете запустить следующий код, чтобы увидеть список ключевых слов в любой версии Python, которую вы используете:
Ключевое слово также предоставляет полезное ключевое слово keyword.iskeyword(). Если вам просто нужен быстрый способ проверить передаваемую переменную, вы можете использовать следующий однострочник:
Этот код быстро скажет вам, является ли идентификатор, который вы пытаетесь использовать, ключевым словом или нет.
Отсутствуют круглые скобки, квадратные скобки и кавычки
Часто причиной неправильного синтаксиса в коде Python является пропущенная или несоответствующая закрывающая круглая или квадратная скобка, или цитата. Их может быть трудно обнаружить в очень длинных строках вложенных скобок или в более длинных многострочных блоках. Вы можете обнаружить несоответствующие или отсутствующие кавычки с помощью трассировки Python:
Еще одна распространенная ошибка — забыть закрыть строку. Как с двойными кавычками, так и с одинарными строками в кавычках, ситуация и трассировка одинаковы:
На этот раз курсор в трассировке указывает прямо на код проблемы. Сообщение SyntaxError EOL while scanning string literal является немного более конкретным и полезным для определения проблемы. Это означает, что интерпретатор Python дошел до конца строки (EOL) до того, как открытая строка была закрыта. Чтобы исправить это, закройте строку кавычкой, которая соответствует той, которую вы использовали для ее начала. В этом случае это будет двойная кавычка ( » ).
Кавычки, отсутствующие в операторах внутри f‑строки, также могут привести к неверному синтаксису в Python:
Здесь в ссылке на словарь возрастов внутри напечатанной f‑строки отсутствует закрывающая двойная кавычка из ключевой ссылки. Результирующая трассировка выглядит следующим образом:
Python идентифицирует проблему и сообщает вам, что она существует внутри f‑строки. Сообщение f-string: unterminated string также указывает, в чем проблема. Каретка в этом случае указывает только на начало f‑строки.
Это может быть не так полезно, как если бы курсор указывает на проблемную область f‑строки, но это сужает область, где вам нужно искать. Где-то внутри этой f‑строки есть незавершенная фраза. Вам просто нужно узнать где. Чтобы решить эту проблему, убедитесь, что присутствуют все внутренние кавычки и скобки f‑строки.
То же самое с отсутствием круглых или квадратных скобок. Если вы, например, опустите закрывающую квадратную скобку в списке, Python заметит это и укажет на нее. Однако есть несколько вариантов этого. Первый — убрать закрывающую скобку из списка:
Когда вы запустите этот код, вам сообщат, что возникла проблема с вызовом print() :
Теперь у вас другая трассировка:
В предыдущем примере 3 и print(foo()) были объединены как один элемент, но здесь вы видите запятую, разделяющую их. Теперь вызов print(foo()) добавляется как четвертый элемент списка, и Python достигает конца файла без закрывающей скобки. Трассировка сообщает вам, что Python дошел до конца файла (EOF), но он ожидал чего-то другого.
В этом примере Python ожидал закрывающую скобку ( ] ), но повторяющаяся строка и курсор не очень полезны. Python не может определить отсутствие скобок. Иногда единственное, что вы можете сделать, — это начать с курсора и двигаться назад, пока не сможете определить, что отсутствует, а что нет.
Ошибочный синтаксис словаря
Ранее вы видели, что вы можете получить SyntaxError, если оставите запятую в элементе словаря. Другой формой недопустимого синтаксиса со словарями Python является использование знака равенства ( = ) для разделения ключей и значений вместо двоеточия:
Еще раз, это сообщение об ошибке не очень помогает. Однако повторяющаяся линия и курсор очень полезны! Они указывают прямо на проблемного персонажа.
Вы можете использовать dict() для определения словаря, если этот синтаксис более полезен.
Использование неправильного отступа
Есть два подкласса SyntaxError, которые конкретно решают проблемы с отступами:
В то время как другие языки программирования используют фигурные скобки для обозначения блоков кода, Python использует пробелы. Это означает, что Python ожидает, что пробелы в вашем коде будут вести себя предсказуемо. Он вызовет ошибку IndentationError, если в блоке кода есть строка с неправильным количеством пробелов:
Хотя трассировка очень похожа на трассировку SyntaxError, на самом деле это ошибка IndentationError. Сообщение об ошибке также очень полезно. Он сообщает вам, что уровень отступа строки не соответствует ни одному уровню отступа. Другими словами, print(‘done’) имеет отступ в 2 пробела, но Python не может найти никакой другой строки кода, соответствующей этому уровню отступа. Это можно быстро исправить, убедившись, что код соответствует ожидаемому уровню отступа.
Другой тип SyntaxError — это TabError, который вы будете видеть всякий раз, когда есть строка, содержащая табуляторы или пробелы для ее отступа,в то время как остальная часть файла содержит другой. Это может быть скрыто, пока Python не укажет вам на это!
Если размер табуляции такой же, как и количество пробелов на каждом уровне отступа, может показаться, что все строки находятся на одном уровне. Однако, если одна строка имеет отступ с использованием пробелов, а другая — с помощью табуляции,тогда Python укажет на это как на проблему:
Здесь строка 5 имеет отступ с табуляции вместо 4 пробелов. Этот блок кода может выглядеть идеально для вас или может выглядеть совершенно неправильно, в зависимости от настроек вашей системы.
Однако Python сразу же заметит проблему. Но прежде чем запустить код, чтобы увидеть, что Python скажет вам об ошибке, возможно, вам будет полезно увидеть пример того, как выглядит код при разных настройках ширины вкладки:
Обратите внимание на разницу в отображении между тремя приведенными выше примерами. Большая часть кода использует 4 пробела для каждого уровня отступа, но в строке 5 во всех трех примерах используется одна табуляция. Ширина вкладки изменяется в зависимости от настройки ширины вкладки:
Когда вы запустите код, вы получите следующую ошибку и трассировку:
Обратите внимание на TabError вместо обычного SyntaxError. Python указывает на проблемную строку и выдает полезное сообщение об ошибке. Он четко говорит о том, что в одном файле для отступов используется смесь табуляции и пробелов.
Определение и вызов функций
Вы можете столкнуться с недопустимым синтаксисом в Python при определении или вызове функций. Например, вы увидите SyntaxError, если используете точку с запятой вместо двоеточия в конце определения функции:
Отслеживание здесь очень полезно, поскольку курсор указывает прямо на проблемный символ. Вы можете устранить этот недопустимый синтаксис в Python, заменив точку с запятой двоеточием.
Кроме того, аргументы ключевых слов как в определениях функций, так и в вызовах функций должны быть в правильном порядке. Аргументы ключевого слова всегда идут после позиционных аргументов. Несоблюдение этого порядка приведет к ошибке SyntaxError:
Здесь, опять же, сообщение об ошибке очень помогает, говоря вам, что именно не так с линией.
Изменение версий Python
Иногда код, который отлично работает в одной версии Python, ломается в более новой версии. Это связано с официальными изменениями синтаксиса языка. Наиболее известным примером этого является оператор печати, который превратился из ключевого слова в Python 2 во встроенную функцию в Python 3:
Другая проблема, с которой вы можете столкнуться, — это когда вы читаете или изучаете синтаксис, который является допустимым синтаксисом в более новой версии Python, но недействителен в версии, в которой вы пишете. Примером этого является синтаксис f-строки, который не существует в версиях Python до 3.6:
В версиях Python до 3.6 интерпретатор ничего не знает о синтаксисе f-строки и просто выдает общее сообщение invalid syntax. Проблема в этом случае в том, что код выглядит отлично, но он был запущен с более старой версией Python. Если сомневаетесь, еще раз проверьте, какую версию Python вы используете!Синтаксис Python продолжает развиваться, и в Python 3.8 появилось несколько интересных новых функций:
Если вы хотите опробовать некоторые из этих новых функций, вам необходимо убедиться, что вы работаете в среде Python 3.8. Иначе,вы получите SyntaxError.
Python 3.8 также предоставляет новый SyntaxWarning. Вы увидите это предупреждение в ситуациях, когда синтаксис действителен, но все еще выглядит подозрительно. Примером этого может быть отсутствие запятой между двумя кортежами в списке. Это был бы допустимый синтаксис в версиях Python до 3.8,но код вызовет ошибку TypeError, потому что кортеж не вызывается:
Эта ошибка TypeError означает, что вы не можете вызывать кортеж как функцию, что интерпретатор Python думает, что вы делаете.
В Python 3.8 этот код по-прежнему вызывает ошибку TypeError, но теперь вы также увидите SyntaxWarning, указывающее, как вы можете решить проблему:
Полезное сообщение, сопровождающее новый SyntaxWarning, даже содержит подсказку «perhaps you missed a comma?» («возможно, вы пропустили запятую?»), Чтобы указать вам правильное направление!
Заключение
В этом руководстве вы увидели, какую информацию дает трассировка SyntaxError. Вы также видели много распространенных примеров неверного синтаксиса в Python и способы решения этих проблем. Это не только ускорит ваш рабочий процесс, но и сделает вас более полезным рецензентом кода!
Ошибка SyntaxError при изучении Python может быть неприятной,но теперь вы знаете, как понимать сообщения трассировки и с какими формами недопустимого синтаксиса в Python вы можете столкнуться. В следующий раз, когда вы получите SyntaxError, вы будете лучше подготовлены, чтобы быстро исправить проблему!
Invalid Syntax in Python: Common Reasons for SyntaxError
Watch Now This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Identify Invalid Python Syntax
Python is known for its simple syntax. However, when you’re learning Python for the first time or when you’ve come to Python with a solid background in another programming language, you may run into some things that Python doesn’t allow. If you’ve ever received a SyntaxError when trying to run your Python code, then this guide can help you. Throughout this tutorial, you’ll see common examples of invalid syntax in Python and learn how to resolve the issue.
By the end of this tutorial, you’ll be able to:
Free Bonus: 5 Thoughts On Python Mastery, a free course for Python developers that shows you the roadmap and the mindset you’ll need to take your Python skills to the next level.
Invalid Syntax in Python
When you run your Python code, the interpreter will first parse it to convert it into Python byte code, which it will then execute. The interpreter will find any invalid syntax in Python during this first stage of program execution, also known as the parsing stage. If the interpreter can’t parse your Python code successfully, then this means that you used invalid syntax somewhere in your code. The interpreter will attempt to show you where that error occurred.
SyntaxError Exception and Traceback
When the interpreter encounters invalid syntax in Python code, it will raise a SyntaxError exception and provide a traceback with some helpful information to help you debug the error. Here’s some code that contains invalid syntax in Python:
Note that the traceback message locates the error in line 5, not line 4. The Python interpreter is attempting to point out where the invalid syntax is. However, it can only really point to where it first noticed a problem. When you get a SyntaxError traceback and the code that the traceback is pointing to looks fine, then you’ll want to start moving backward through the code until you can determine what’s wrong.
In the example above, there isn’t a problem with leaving out a comma, depending on what comes after it. For example, there’s no problem with a missing comma after ‘michael’ in line 5. But once the interpreter encounters something that doesn’t make sense, it can only point you to the first thing it found that it couldn’t understand.
Note: This tutorial assumes that you know the basics of Python’s tracebacks. To learn more about the Python traceback and how to read them, check out Understanding the Python Traceback and Getting the Most out of a Python Traceback.
There are a few elements of a SyntaxError traceback that can help you determine where the invalid syntax is in your code:
There are two other exceptions that you might see Python raise. These are equivalent to SyntaxError but have different names:
These exceptions both inherit from the SyntaxError class, but they’re special cases where indentation is concerned. An IndentationError is raised when the indentation levels of your code don’t match up. A TabError is raised when your code uses both tabs and spaces in the same file. You’ll take a closer look at these exceptions in a later section.
Common Syntax Problems
When you encounter a SyntaxError for the first time, it’s helpful to know why there was a problem and what you might do to fix the invalid syntax in your Python code. In the sections below, you’ll see some of the more common reasons that a SyntaxError might be raised and how you can fix them.
Misusing the Assignment Operator ( = )
There are several cases in Python where you’re not able to make assignments to objects. Some examples are assigning to literals and function calls. In the code block below, you can see a few examples that attempt to do this and the resulting SyntaxError tracebacks:
The first example tries to assign the value 5 to the len() call. The SyntaxError message is very helpful in this case. It tells you that you can’t assign a value to a function call.
The second and third examples try to assign a string and an integer to literals. The same rule is true for other literal values. Once again, the traceback messages indicate that the problem occurs when you attempt to assign a value to a literal.
Note: The examples above are missing the repeated code line and caret ( ^ ) pointing to the problem in the traceback. The exception and traceback you see will be different when you’re in the REPL vs trying to execute this code from a file. If this code were in a file, then you’d get the repeated code line and caret pointing to the problem, as you saw in other cases throughout this tutorial.
It’s likely that your intent isn’t to assign a value to a literal or a function call. For instance, this can occur if you accidentally leave off the extra equals sign ( = ), which would turn the assignment into a comparison. A comparison, as you can see below, would be valid:
Most of the time, when Python tells you that you’re making an assignment to something that can’t be assigned to, you first might want to check to make sure that the statement shouldn’t be a Boolean expression instead. You may also run into this issue when you’re trying to assign a value to a Python keyword, which you’ll cover in the next section.
Misspelling, Missing, or Misusing Python Keywords
Python keywords are a set of protected words that have special meaning in Python. These are words you can’t use as identifiers, variables, or function names in your code. They’re a part of the language and can only be used in the context that Python allows.
There are three common ways that you can mistakenly use keywords:
Another common issue with keywords is when you miss them altogether:
Once again, the exception message isn’t that helpful, but the traceback does attempt to point you in the right direction. If you move back from the caret, then you can see that the in keyword is missing from the for loop syntax.
You can also misuse a protected Python keyword. Remember, keywords are only allowed to be used in specific situations. If you use them incorrectly, then you’ll have invalid syntax in your Python code. A common example of this is the use of continue or break outside of a loop. This can easily happen during development when you’re implementing things and happen to move logic outside of a loop:
Here, Python does a great job of telling you exactly what’s wrong. The messages «‘break’ outside loop» and «‘continue’ not properly in loop» help you figure out exactly what to do. If this code were in a file, then Python would also have the caret pointing right to the misused keyword.
Another example is if you attempt to assign a Python keyword to a variable or use a keyword to define a function:
The list of protected keywords has changed with each new version of Python. For example, in Python 3.6 you could use await as a variable name or function name, but as of Python 3.7, that word has been added to the keyword list. Now, if you try to use await as a variable or function name, this will cause a SyntaxError if your code is for Python 3.7 or later.
| Version | print Type | Takes A Value |
|---|---|---|
| Python 2 | keyword | no |
| Python 3 | built-in function | yes |
print is a keyword in Python 2, so you can’t assign a value to it. In Python 3, however, it’s a built-in function that can be assigned values.
You can run the following code to see the list of keywords in whatever version of Python you’re running:
This code will tell you quickly if the identifier that you’re trying to use is a keyword or not.
Missing Parentheses, Brackets, and Quotes
Often, the cause of invalid syntax in Python code is a missed or mismatched closing parenthesis, bracket, or quote. These can be hard to spot in very long lines of nested parentheses or longer multi-line blocks. You can spot mismatched or missing quotes with the help of Python’s tracebacks:
Here, the traceback points to the invalid code where there’s a t’ after a closing single quote. To fix this, you can make one of two changes:
Another common mistake is to forget to close string. With both double-quoted and single-quoted strings, the situation and traceback are the same:
Quotes missing from statements inside an f-string can also lead to invalid syntax in Python:
Here, the reference to the ages dictionary inside the printed f-string is missing the closing double quote from the key reference. The resulting traceback is as follows:
Python identifies the problem and tells you that it exists inside the f-string. The message «unterminated string» also indicates what the problem is. The caret in this case only points to the beginning of the f-string.
This might not be as helpful as when the caret points to the problem area of the f-string, but it does narrow down where you need to look. There’s an unterminated string somewhere inside that f-string. You just have to find out where. To fix this problem, make sure that all internal f-string quotes and brackets are present.
The situation is mostly the same for missing parentheses and brackets. If you leave out the closing square bracket from a list, for example, then Python will spot that and point it out. There are a few variations of this, however. The first is to leave the closing bracket off of the list:
When you run this code, you’ll be told that there’s a problem with the call to print() :
Another variation is to add a trailing comma after the last element in the list while still leaving off the closing square bracket:
Now you get a different traceback:
In the previous example, 3 and print(foo()) were lumped together as one element, but here you see a comma separating the two. Now, the call to print(foo()) gets added as the fourth element of the list, and Python reaches the end of the file without the closing bracket. The traceback tells you that Python got to the end of the file (EOF), but it was expecting something else.
In this example, Python was expecting a closing bracket ( ] ), but the repeated line and caret are not very helpful. Missing parentheses and brackets are tough for Python to identify. Sometimes the only thing you can do is start from the caret and move backward until you can identify what’s missing or wrong.
Mistaking Dictionary Syntax
You saw earlier that you could get a SyntaxError if you leave the comma off of a dictionary element. Another form of invalid syntax with Python dictionaries is the use of the equals sign ( = ) to separate keys and values, instead of the colon:
Once again, this error message is not very helpful. The repeated line and caret, however, are very helpful! They’re pointing right to the problem character.
This type of issue is common if you confuse Python syntax with that of other programming languages. You’ll also see this if you confuse the act of defining a dictionary with a dict() call. To fix this, you could replace the equals sign with a colon. You can also switch to using dict() :
You can use dict() to define the dictionary if that syntax is more helpful.
Using the Wrong Indentation
There are two sub-classes of SyntaxError that deal with indentation issues specifically:
While other programming languages use curly braces to denote blocks of code, Python uses whitespace. That means that Python expects the whitespace in your code to behave predictably. It will raise an IndentationError if there’s a line in a code block that has the wrong number of spaces:
This might be tough to see, but line 5 is only indented 2 spaces. It should be in line with the for loop statement, which is 4 spaces over. Thankfully, Python can spot this easily and will quickly tell you what the issue is.
There’s also a bit of ambiguity here, though. Is the print(‘done’) line intended to be after the for loop or inside the for loop block? When you run the above code, you’ll see the following error:
If your tab size is the same width as the number of spaces in each indentation level, then it might look like all the lines are at the same level. However, if one line is indented using spaces and the other is indented with tabs, then Python will point this out as a problem:
Here, line 5 is indented with a tab instead of 4 spaces. This code block could look perfectly fine to you, or it could look completely wrong, depending on your system settings.
Python, however, will notice the issue immediately. But before you run the code to see what Python will tell you is wrong, it might be helpful for you to see an example of what the code looks like under different tab width settings:
Notice the difference in display between the three examples above. Most of the code uses 4 spaces for each indentation level, but line 5 uses a single tab in all three examples. The width of the tab changes, based on the tab width setting:
When you run the code, you’ll get the following error and traceback:
The solution to this is to make all lines in the same Python code file use either tabs or spaces, but not both. For the code blocks above, the fix would be to remove the tab and replace it with 4 spaces, which will print ‘done’ after the for loop has finished.
Defining and Calling Functions
You might run into invalid syntax in Python when you’re defining or calling functions. For example, you’ll see a SyntaxError if you use a semicolon instead of a colon at the end of a function definition:
The traceback here is very helpful, with the caret pointing right to the problem character. You can clear up this invalid syntax in Python by switching out the semicolon for a colon.
In addition, keyword arguments in both function definitions and function calls need to be in the right order. Keyword arguments always come after positional arguments. Failure to use this ordering will lead to a SyntaxError :
Here, once again, the error message is very helpful in telling you exactly what is wrong with the line.
Changing Python Versions
Sometimes, code that works perfectly fine in one version of Python breaks in a newer version. This is due to official changes in language syntax. The most well-known example of this is the print statement, which went from a keyword in Python 2 to a built-in function in Python 3:
This is one of the examples where the error message provided with the SyntaxError shines! Not only does it tell you that you’re missing parenthesis in the print call, but it also provides the correct code to help you fix the statement.
Another problem you might encounter is when you’re reading or learning about syntax that’s valid syntax in a newer version of Python, but isn’t valid in the version you’re writing in. An example of this is the f-string syntax, which doesn’t exist in Python versions before 3.6:
In versions of Python before 3.6, the interpreter doesn’t know anything about the f-string syntax and will just provide a generic «invalid syntax» message. The problem, in this case, is that the code looks perfectly fine, but it was run with an older version of Python. When in doubt, double-check which version of Python you’re running!
Python syntax is continuing to evolve, and there are some cool new features introduced in Python 3.8:
This TypeError means that you can’t call a tuple like a function, which is what the Python interpreter thinks you’re doing.
The helpful message accompanying the new SyntaxWarning even provides a hint ( «perhaps you missed a comma?» ) to point you in the right direction!
Conclusion
In this tutorial, you’ve seen what information the SyntaxError traceback gives you. You’ve also seen many common examples of invalid syntax in Python and what the solutions are to those problems. Not only will this speed up your workflow, but it will also make you a more helpful code reviewer!
When you’re writing code, try to use an IDE that understands Python syntax and provides feedback. If you put many of the invalid Python code examples from this tutorial into a good IDE, then they should highlight the problem lines before you even get to execute your code.
Watch Now This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Identify Invalid Python Syntax
Get a short & sweet Python Trick delivered to your inbox every couple of days. No spam ever. Unsubscribe any time. Curated by the Real Python team.
About Chad Hansen

Chad is an avid Pythonista and does web development with Django fulltime. Chad lives in Utah with his wife and six kids.
Each tutorial at Real Python is created by a team of developers so that it meets our high quality standards. The team members who worked on this tutorial are:
Master Real-World Python Skills With Unlimited Access to Real Python
Join us and get access to hundreds of tutorials, hands-on video courses, and a community of expert Pythonistas:
Master Real-World Python Skills
With Unlimited Access to Real Python
Join us and get access to hundreds of tutorials, hands-on video courses, and a community of expert Pythonistas:
Real Python Comment Policy: The most useful comments are those written with the goal of learning from or helping out other readers—after reading the whole article and all the earlier comments. Complaints and insults generally won’t make the cut here.
What’s your #1 takeaway or favorite thing you learned? How are you going to put your newfound skills to use? Leave a comment below and let us know.
Related Tutorial Categories: basics python



