Синтаксическая ошибка проверьте отступы

На чтение 3 мин. Просмотров 770 Опубликовано 18.04.2021

Python – это развивающийся язык программирования, который был впервые выпущен в 1991 году. Этот язык известен своей большой всеобъемлющей библиотекой и поддерживает несколько парадигм программирования, таких как функциональное, императивное, процедурное и объектно-ориентированное.

Ошибка отступа: ожидается блок с отступом ‘ встречается у всех типов пользователей ; будь то новички или опытные. Поскольку Python упорядочивает весь свой код с помощью правильных пробелов, если у вас плохой отступ, код не будет компилироваться, и вам будет возвращено сообщение об ошибке.

Согласно соглашениям, принятым в PEP8, при необходимости должно быть четыре пробела. Для каждого программиста идеально использовать правильные отступы, чтобы улучшить читаемость кода.

Содержание

  1. Что вызывает ошибку отступов в Python?
  2. Решение 1. Проверка неправильных пробелов/табуляций
  3. Решение 2: Включение символов табуляции/пробела в редакторе

Что вызывает ошибку отступов в Python?

Like Как упоминалось ранее, эта ошибка в основном возникает из-за того, что в вашем коде есть пробелы или табуляции. Поскольку Python использует процедурный язык, вы можете столкнуться с этой ошибкой, если вы неправильно разместили табуляции/пробелы. Программа может работать правильно, но если интерпретатор обнаружит эту ошибку, сообщение об ошибке появится посередине. Некоторые из причин ошибки:

  • В вашем коде используются как пробелы, так и табуляции . Если оба используются взаимозаменяемо, интерпретатор не сможет определить, какой элемент использовать.
  • Вы разместили отступ неправильно . Если практика отступов не соблюдается, эта ошибка неизбежно возникнет.
  • Вы забыли сделать отступ для составных операторов , таких как ‘if’, ‘for’, ‘while’ и т. д.
  • Вы забыли сделать отступ для пользовательских функций или классов .

Решение 1. Проверка неправильных пробелов/табуляций

Для этой проблемы нет мгновенного решения. Поскольку код ваш, вы должны просмотреть каждую строку и посмотреть, где вы допустили ошибку. В коде есть несколько блоков по структуре. Если есть оператор ‘If’, в коде, который следует за ним, должен быть отступ.

Посмотрите на диаграмму выше. Убедитесь, что отступ для определенного блока остается неизменным во всем коде, даже если новый блок вводится посередине. Убедитесь, что ваш отступ согласован. Если вы используете пробелы, всегда используйте пробелы, а если вы используете табуляции, всегда используйте табуляции. Смешивание двух элементов вызовет проблемы.

Правильный отступ показан в приведенном выше примере. См. Цикл «for» для начала. Все внутри цикла for должно иметь отступ. Внутри цикла for у нас есть оператор if. Внутри оператора «if» все должно иметь больше отступов..

Вы можете легко проверить, где произошла ошибка отступа, проверив журнал ошибок и посмотрев строку, откуда возникла ошибка.

Решение 2: Включение символов табуляции/пробела в редакторе

Если вам трудно сделать отступ в коде «догадываться», как это делают все программисты, вы можете включить символы табуляции/пробела в ваша IDE или редактор кода. Эта опция активирует маленькие «точки» в вашем коде, где каждая точка представляет собой пробел или табуляцию. Вы можете использовать это для более правильного отступа кода и убедиться, что нет лишнего отступа или некоторые из них отсутствуют.

В этом примере мы возьмем Notepad ++ и посмотрим, как вы можете включить символы. Если вы используете другое программное обеспечение для редактирования кода, вы можете включить настройку, относящуюся к нему.

  1. Нажмите Вид> Показать символ> Показать пробелы и TAB
  1. Теперь опция включена. Вы также можете включить Руководство по отступам , чтобы вам было проще.

Посмотрите пример выше. См. Отступ, реализованный после каждого класса. Каждое пространство представлено одной точкой. После внесения изменений в неправильный отступ в коде запустите его еще раз и посмотрите, решит ли это проблему.

There are in fact multiples things you need to know about indentation in Python:

Python really cares about indention.

In a lot of other languages the indention is not necessary but improves readability. In Python indentation replaces the keyword begin / end or { } and is therefore necessary.

This is verified before the execution of the code, therefore even if the code with the indentation error is never reached, it won’t work.

There are different indention errors and you reading them helps a lot:

1. «IndentationError: expected an indented block»

They are two main reasons why you could have such an error:

— You have a «:» without an indented block behind.

Here are two examples:

Example 1, no indented block:

Input:

if 3 != 4:
    print("usual")
else:

Output:

  File "<stdin>", line 4

    ^
IndentationError: expected an indented block

The output states that you need to have an indented block on line 4, after the else: statement

Example 2, unindented block:

Input:

if 3 != 4:
print("usual")

Output

  File "<stdin>", line 2
    print("usual")
        ^
IndentationError: expected an indented block

The output states that you need to have an indented block line 2, after the if 3 != 4: statement

— You are using Python2.x and have a mix of tabs and spaces:

Input

def foo():
    if 1:
        print 1

Please note that before if, there is a tab, and before print there is 8 spaces.

Output:

  File "<stdin>", line 3
    print 1
      ^
IndentationError: expected an indented block

It’s quite hard to understand what is happening here, it seems that there is an indent block… But as I said, I’ve used tabs and spaces, and you should never do that.

  • You can get some info here.
  • Remove all tabs and replaces them by four spaces.
  • And configure your editor to do that automatically.

2. «IndentationError: unexpected indent»

It is important to indent blocks, but only blocks that should be indent.
So basically this error says:

— You have an indented block without a «:» before it.

Example:

Input:

a = 3
  a += 3

Output:

  File "<stdin>", line 2
    a += 3
    ^
IndentationError: unexpected indent

The output states that he wasn’t expecting an indent block line 2, then you should remove it.

3. «TabError: inconsistent use of tabs and spaces in indentation» (python3.x only)

  • You can get some info here.
  • But basically it’s, you are using tabs and spaces in your code.
  • You don’t want that.
  • Remove all tabs and replaces them by four spaces.
  • And configure your editor to do that automatically.

Eventually, to come back on your problem:

Just look at the line number of the error, and fix it using the previous information.

Python – один из самых популярных языков программирования в мире. Поскольку это интерпретируемый язык, он дает разработчикам большую гибкость при написании кода. Но с большой свободой приходит и большая ответственность и еще больше возможностей для совершения ошибок. В этой статье мы разберем ошибки программистов Python, которые встречаются чаще всего. Также мы расскажем, как их исправить.

Мы рассмотрим следующие ошибки:

  • Неправильные отступы
  • ImportError
  • Изменяемые аргументы, установленные по умолчанию
  • Забытое двоеточие
  • Несоответствие скобок
  • Неправильное применение функции инициализации
  • Изменение значений переменных класса без использования имени класса
  • Непонимание правил области видимости в Python
  • Непонимание того, как Python связывает переменные в замыканиях
  • Исчерпание итераторов

Неправильные отступы

В Python отступ указывает, относится ли данная строка к предыдущему оператору в блоке кода. Официальные правила стиля Python (PEP 8) рекомендуют использовать отступ в четыре пробела. Однако вы можете выбирать любое количество пробелов, а также пользоваться табами. Какой бы отступ вы ни предпочли, Python требует одного – согласованности.

Чтобы исправить ошибку отступа, попробуйте сделать следующее:

  • Используйте пробелы или табы, но не комбинируйте их. Будьте особенно внимательны, так как вы можете не осознавать, что использовали и табы, и пробелы, если полученный отступ выглядит одинаково. Преобразование табов в пробелы (или наоборот) скорее всего можно настроить в вашем редакторе кода или IDE.
  • Следите за количеством пробелов, которые вы используете. Следовать рекомендации PEP 8 о четырех пробелах не обязательно, но какое бы число вы ни выбрали, придерживайтесь его! К примеру, если вы делаете отступы по 2 пробела, то везде должно быть 2 пробела.

ImportError

Возможно, вы импортируете встроенный модуль, который, как вы уверены, находится в стандартной библиотеке Python, но, к вашему удивлению и разочарованию, интерпретатор возвращает ImportError.

Эта проблема обычно возникает, когда разработчики импортируют в свою библиотеку файл, имя которого совпадает с именем одного из встроенных модулей стандартной библиотеки. В таких ситуациях Python отдает приоритет установленному вами модулю с таким же именем, а не встроенному модулю стандартной библиотеки.

Решение? Просто переименуйте файл в своей библиотеке и дайте ему уникальное имя, которое не используется в модулях стандартной библиотеки.

[python_ad_block]

Использование изменяемых типов для аргументов, устанавливаемых по умолчанию

Другая распространенная проблема возникает при назначении изменяемых типов данных для аргументов по умолчанию. Python оценивает значения по умолчанию для изменяемых типов данных только один раз, во время создания функции. Он не будет инициализировать значение по умолчанию для любого последующего вызова. Вы можете не заметить ничего необычного, если выполняете только один вызов функции в своем коде, однако, если вы вызовете её второй раз, Python будет использовать значение по умолчанию, вычисленное во время первого вызова.

Допустим, вы используете в качестве аргумента по умолчанию изменяемый тип данных, например список. Интерпретатор будет использовать тот же список, который был создан при первоначальном определении функции. Следующий код демонстрирует непонятное поведение, которое может возникнуть при добавлении элементов в такой список:

def some_func(default_arg=[]):
    default_arg.append("some_string")
    return default_arg

print(some_func())
print(some_func())
print(some_func([]))
print(some_func())

=>['some_string']
=>['some_string', 'some_string']
=>['some_string']
=>['some_string', 'some_string', 'some_string']

Один из способов устранения этой ошибки программирования – присвоить значение по умолчанию None. В следующем коде любое значение, переданное в функцию, соответствует аргументу:

def some_func(default_arg=None):
    if default_arg is None:
        default_arg = []
    default_arg.append("some_string")
    return default_arg

print(some_func())
print(some_func())
print(some_func([]))
print(some_func())
=>['some_string']
=>['some_string']
=>['some_string']
=>['some_string']

Забытое двоеточие

Если вы получаете синтаксические ошибки, возможно, вы забыли двоеточие в конце предложения. В коде Python каждое структурное предложение заканчивается двоеточием. Это также относится к заголовкам функций, где двоеточие вызывает отступ для последующих строк внутри функции. Это распространенная ошибка для начинающих разработчиков Python. Чтобы исправить это, просто отрабатывайте это правило до тех пор, пока оно не станет второй натурой: каждое структурное предложение заканчивается двоеточием!

Несоответствие скобок

Это удивительно частая ошибка начинающих разработчиков Python. Как и в математике, количество открытых и закрытых скобок должно совпадать. Обязательно просмотрите свой код и убедитесь, что каждая открытая скобка имеет соответствующую закрытую, чтобы код работал корректно.

Неправильное применение функции инициализации

Используемая как конструктор, функция __init__ создает объект или выделяет память для нового объекта класса. Функция __init__ используется в качестве конструктора, когда объект создается из класса, и позволяет классу инициализировать атрибуты класса. Другими словами, она используется исключительно для установки значений. Однако распространенной ошибкой разработчиков Python является попытка использовать этот метод для возврата значений. Чтобы исправить это, просто запомните, что функция __init__ в Python предназначена исключительно для использования в качестве конструктора класса.

Изменение значений переменных класса без использования имени класса

Поскольку Python — объектно-ориентированный язык, переменные класса и экземпляра работают по-разному.

В отличие от переменных экземпляра, переменные класса используются экземплярами во всем классе. Если вы изменяете переменную класса без использования имени класса, создается переменная экземпляра с тем же именем, что и переменная класса. Новые переменные экземпляра с теми же именами, что и переменные класса, фактически затеняют переменную класса, поэтому, если вы пытаетесь изменить переменную класса во второй раз, объекты в коде вместо этого будут ссылаться на переменные экземпляра.

Чтобы исправить эту ошибку, обязательно используйте имя класса при изменении переменной класса, чтобы все объекты также получили новое значение.

Если ваш код возвращает UnboundLocalError, возможно, вы не разобрались в областях видимости Python. Это распространенная ошибка, с которой сталкиваются разработчики Python при использовании списков.

Уникальный анализ области действия Python основан на правиле LEGB (Local, Enclosing, Global, Built-in). Следуя порядку LEGB, Python сначала предположит, что любая переменная, объявленная в диапазоне, является локальной для этой области, и переопределит любую переменную с тем же именем во внешней области. Это означает, что код, который выполнялся должным образом при объявлении переменной, может позже вернуть UnboundLocalError при повторном вызове функции.

В следующем примере мы рассмотрим код, который изначально работает должным образом:

x = 10
def bar():
    print(x)
bar()
=>10

Однако этот код возвращает UnboundLocalError, как только мы попробуем изменить значение переменной х. Согласно порядку LEGB, Python распознает эту операцию для x как для локальной переменной, а не как переменную внешней области видимости.

x = 10
def foo():
    print(x)
    x += 1
foo()
=>Traceback (most recent call last):
=>  File "main.py", line 5, in <module>
=>    foo()
=>  File "main.py", line 3, in foo
=>    print(x)
=>UnboundLocalError: local variable 'x' referenced before assignment

Чтобы исправить UnboundLocalError, просто нужно добавить оператор присваивания, чтобы явно объявить, что переменная является глобальной.

x = 10
def foobar():
    global x
    print(x)
    x += 1
foobar()
=>10

Непонимание того, как Python связывает переменные в замыканиях

Python поздно связывает свои переменные в замыканиях. Это означает, что он вызывает значения переменных, которые были возвращены при первом вызове затронутой функции. Это не всегда может быть проблемой. Но если это все же проблема, вы можете ее исправить, создав замыкание, которое будет немедленно связываться с его аргументами, например с аргументом по умолчанию.

Исчерпанные итераторы

Начинающим разработчикам Python важно понимать, что итераторы и генераторы могут быть исчерпаны. Особенно часто с этой проблемой сталкиваются разработчики, переходящие с Python 2 на Python 3. В Python 3 намного больше генераторов, что помогает сделать его более эффективным. Однако это может быть сложно для тех, кто сталкивается с новыми особенностями, которых не было в Python 2.

Данный тип ошибки может выглядеть следующим образом. В Python 2 вы можете вызвать функцию-итератор, такую ​​как zip(), для объединения двух списков и попытаться затем распечатать этот список. Если вы используете тот же самый код в Python 3, он не вернет вам все значения сразу. Это потому, что вы исчерпали итератор, и у него нет оставшихся значений для возврата.

Вы можете исправить это, просто преобразовав функцию в список с самого начала. Вы можете исчерпать итератор, но не список.

Заключение

Сегодня мы рассмотрели 10 распространенных ошибок программистов Python и пути их устранения. Надеемся статья была вам полезна. Успехов в написании кода!

Перевод статьи «10 common mistakes Python programmers make (and how to fix them)».

Получение «недействительного синтаксиса» в простом обратном выражении практически невозможно. Если вы используете его вне функции, вы получаете 'return' outside function, если у вас есть неправильный отступ, вы получаете IndentationError и т.д.

Единственный способ получить SyntaxError: invalid syntax в операторе return — это, если на самом деле он вообще не говорит return, но если он содержит символы не-ascii, такие как retürn. Это даст эту ошибку. Теперь, как вы можете получить эту ошибку, не видя ее? Опять же, единственная идея, которую я могу придумать, состоит в том, что у вас на самом деле есть отступы, но этот отступ не является пробелами или вкладками. Например, вы можете каким-то образом вставить незашифрованное пространство в свой код.

Да, это может случиться. Да, это случилось со мной. Да, вы получите SyntaxError: invalid syntax.

Lennart Regebro
14 фев. 2011, в 12:21

Поделиться

У меня была та же проблема. Вот мой код:

def gccontent(genomefile):
    nbases = 0
    totalbases = 0
    GC = 0
    for line in genomefile.xreadlines():
        nbases += count(seq, 'N')
        totalbases += len(line)
        GC += count(line, 'G' or 'C')
    gcpercent = (float(GC)/(totalbases - nbases)*100
    return gcpercent

‘return’ имеет недопустимый синтаксис

Мне просто не удалось закрыть скобку по следующему коду:

gcpercent = (float(GC)/(totalbases - nbases)*100

Надеюсь, что это поможет.

Jonathan
14 окт. 2011, в 16:40

Поделиться

Я получил «Недопустимый синтаксис» при возврате, когда забыл закрыть скобку на моем коде.

elif year1==year2 and month1 != month2:
    total_days = (30-day1)+(day2)+((month2-(month1+1))*30   
    return (total_days)    

Недопустимый синтаксис при возврате.

((month2-(month1+1))*30  <---- there should be another bracket

((month2-(month1+1)))*30

Теперь мой код работает.

Они должны улучшить python, чтобы сказать вам, если вы забыли закрыть свои скобки вместо синтаксиса «недействительный» при возврате.

Thuy
11 дек. 2013, в 07:03

Поделиться

Я просто посмотрел на это, потому что у меня была такая же проблема (неверная синтаксическая ошибка в заявлении о возврате плана), и я чрезвычайно новичок в python (первый месяц), поэтому я понятия не имею, что я делаю большую часть времени.

ну, я нашел свою ошибку, я забыл конечные круглые скобки на предыдущей строке. попробуйте проверить конец предыдущей строки для забытых круглых скобок или цитаты?

emmet
13 нояб. 2015, в 05:32

Поделиться

Обычно это сводная синтаксическая ошибка. Проверьте ошибку.

Jared
01 авг. 2012, в 01:29

Поделиться

>>> 45 return
  File "<stdin>", line 1
    45 return
            ^
SyntaxError: invalid syntax
>>> 

Это может объяснить это. Он не объясняет 44 f = open(filename, 'r'), но я подозреваю, что кто-то скопировал и вставил 45 строк кода, где отступы были потеряны и были включены номера строк.

S.Lott
14 фев. 2011, в 16:44

Поделиться

Ещё вопросы

  • 0Подогнать изображение в DIV в Internet Explorer 8
  • 0Генерация нескольких JQuery Click
  • 0глобальная переменная с session_start ();
  • 0используйте оператор запятой для инициализации базового класса
  • 0Липкая боковая панель, которая прилипает только тогда, когда нижняя часть боковой панели находится в нижней части окна
  • 1Средние данные с одинаковым ключом в массиве словаря
  • 1Как получить первый элемент результата базы данных FIrebase в Python?
  • 1Android SetPixels () Объяснение и пример?
  • 1Горячая клавиша для закрытия блока кода с помощью фигурных скобок в Eclipse
  • 0Можно ли переопределить метод универсального класса в Java?
  • 0Node / MySQL — код: «ER_PARSE_ERROR», при попытке вставить ~ 800 записей
  • 1Пользовательская страница входа MarkLogic App Server cookie cookie с идентификатором GET
  • 3Рассчитать остаточное отклонение от модели логистической регрессии scikit-learn
  • 0Сохраните файл CSV в папке пользователя на компьютере пользователя.
  • 0Функция моего друга не выполняется
  • 1Как узнать, играет ли звук с помощью C #?
  • 1Какой лучший способ сделать это вычисление панд?
  • 0jQuery — объект Animate, которому был присвоен случайный идентификатор
  • 1расчет тепловой карты панд на море
  • 0получить данные единой таблицы формы родительского дочернего запроса таблицы pos_parent_id в качестве дочернего идентификатора
  • 1Возможности перехода с Google+ Вход в Google Вход
  • 1Эквивалент adControl.HasAd в Windows Phone 8.0
  • 0Читать сырой сокет ip заголовок? C ++
  • 1Как я могу обрезать область, содержащую данные получателя в письме с помощью обработки изображений в C #?
  • 1Как опубликовать данные base64string в веб-просмотре с URL?
  • 1Возобновление асинхронного чтения с использованием Rx?
  • 0Получить HTML-теги как страницу из базы данных
  • 1Как смоделировать RestTemplate метод getForObject, используя jmockit?
  • 0Сайт учебник, написанный на html / js?
  • 1Java — длина буфера для записи файла
  • 1Как получить пользовательский ввод в двух отдельных массивах?
  • 1Windows Phone — любой шаблон дизайна формы?
  • 1Хранение содержимого таблиц из одного класса в другой класс в Java
  • 0Переменная поля формы электронной почты
  • 1Telegram TypeError: первый аргумент должен быть вызываемым
  • 1Фильтрация результатов по пересечению коллекций?
  • 0Я получаю ОШИБКУ 1452 (23000) в MySQL
  • 0Угловая проверка разрешений JS
  • 0Алгоритм моделирования средних
  • 1dc.js Вид по умолчанию для таблицы строк отсортирован и не переупорядочивается при нажатии
  • 1Как нанести несколько второстепенных сюжетов на фоновое изображение с помощью matplotlib?
  • 1Работают ли делегаты C # как функции Excel / User Defined?
  • 0ссылка на директиву angular js не может получить доступ к сгенерированному идентификатору элемента
  • 0Определите, является ли изображение векторным или растровым с помощью PHP
  • 1Как завершить приложение, когда оно уходит в фоновом режиме
  • 0PHP — замена нескольких наборов заполнителей во время циклического перемещения по массивам
  • 1Всплывающее окно над экраном вызова в версии Android 7.0
  • 1Crashlytics сообщает в Fabric, но в Firebase Crashlytics нет никаких следов
  • 0Создание отдельной таблицы для отслеживания определенного столбца с использованием типа данных TIMESTAMP

Очень распространённая ошибка из-за невнимательности. Забыли закрыть скобку на предыдущей строке.


Почему показало на эту строку?

Потому что синтаксический анализатор ожидает продолжения лексемы внутри открытой скобки, но, т.к. продолжение лексемы находится на новой строке, то ошибка указывает именно на неё.
Для примера:

>>> print(1
... print(2)
  File "<stdin>", line 2
    print(2)
        ^
SyntaxError: invalid syntax

Без переноса строки:

>>> print(1 print(2)
  File "<stdin>", line 1
    print(1 print(2)
                ^
SyntaxError: invalid syntax

Просто получается конструкция вида value print(..., но, т.к. в питоне нет таких синтаксических конструкций, то мы получаем соответствующую ошибку.


В приведённой Вами строке

a = input("Введи первое число: ")

синтаксически всё правильно.

Понравилась статья? Поделить с друзьями:
  • Синтаксическая ошибка примеры и исправления
  • Синтаксическая ошибка при чтении пакета
  • Синтаксическая ошибка при установки приложения
  • Синтаксическая ошибка при установке что это значит
  • Синтаксическая ошибка при установке приложения что это