что значит invalid syntax в питоне
Программа не работает. Что делать?
Моя программа не работает! Что делать? В данной статье я постараюсь собрать наиболее частые ошибки начинающих программировать на python 3, а также расскажу, как их исправлять.
Проблема: Моя программа не запускается. На доли секунды появляется чёрное окошко, а затем исчезает.
Причина: после окончания выполнения программы (после выполнения всего кода или при возникновении исключения программа закрывается. И если вы её вызвали двойным кликом по иконке (а вы, скорее всего, вызвали её именно так), то она закроется вместе с окошком, в котором находится вывод программы.
Решение: запускать программу через IDLE или через консоль.
Проблема: Не работает функция input. Пишет SyntaxError.
Причина: Вы запустили Python 2.
Проблема: Где-то увидел простую программу, а она не работает.
Причина: Вам подсунули программу на Python 2.
Решение: Прочитать об отличиях Python 2 от Python 3. Переписать её на Python 3. Например, данная программа на Python 3 будет выглядеть так:
Проблема: TypeError: Can’t convert ‘int’ object to str implicitly.
Причина: Нельзя складывать строку с числом.
Решение: Привести строку к числу с помощью функции int(). Кстати, заметьте, что функция input() всегда возвращает строку!
Проблема: SyntaxError: invalid syntax.
Причина: Забыто двоеточие.
Проблема: SyntaxError: invalid syntax.
Причина: Забыто равно.
Проблема: NameError: name ‘a’ is not defined.
Причина: Переменная «a» не существует. Возможно, вы опечатались в названии или забыли инициализировать её.
Решение: Исправить опечатку.
Проблема: IndentationError: expected an indented block.
Причина: Нужен отступ.
Проблема: TabError: inconsistent use of tabs and spaces in indentation.
Причина: Смешение пробелов и табуляции в отступах.
Решение: Исправить отступы.
Проблема: UnboundLocalError: local variable ‘a’ referenced before assignment.
Причина: Попытка обратиться к локальной переменной, которая ещё не создана.
Проблема: Программа выполнилась, но в файл ничего не записалось / записалось не всё.
Причина: Не закрыт файл, часть данных могла остаться в буфере.
Проблема: Здесь может быть ваша проблема. Комментарии чуть ниже 🙂
Как чинить 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, вы будете лучше подготовлены, чтобы быстро исправить проблему!