Что делать с «Неожиданным отступом» в python? - PullRequest
102 голосов
/ 19 июня 2009

Как исправить ошибку «неожиданный отступ» в python?

Ответы [ 15 ]

120 голосов
/ 19 июня 2009

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

Неожиданный отступ. Эта строка кода имеет больше пробелов в начале, чем предыдущая, но предыдущая не является началом субблока (например, оператор if / while / for). Все строки кода в блоке должны начинаться с одинаковой строки пробела. Например:

>>> def a():
...   print "foo"
...     print "bar"
IndentationError: unexpected indent

Это особенно распространено при интерактивном запуске python: убедитесь, что вы не ставите лишние пробелы перед своими командами. (Очень раздражает при копировании и вставке примера кода!)

>>>   print "hello"
IndentationError: unexpected indent

Unindent не соответствует ни одному внешнему уровню отступа. Эта строка кода имеет меньше пробелов в начале, чем предыдущая, но в равной степени она не соответствует ни одному другому блоку, частью которого она может быть. Python не может решить, куда он идет. Например, в следующем тексте предполагается, что окончательная версия будет частью предложения if или нет?

>>> if user == "Joey":
...     print "Super secret powers enabled!"
...   print "Revealing super secrets"
IndendationError: unindent does not match any outer indentation level

Ожидается блок с отступом. Эта строка кода имеет то же количество пробелов в начале, что и предыдущая, но ожидается, что последняя строка должна начинать блок (например, оператор if / while / for) , определение функции).

>>> def foo():
... print "Bar"
IndentationError: expected an indented block

Если вам нужна функция, которая ничего не делает, используйте команду "no-op" pass :

>>> def foo():
...     pass

Допускается смешивание табуляции и пробелов (по крайней мере, в моей версии Python), но Python предполагает, что табуляции имеют длину 8 символов, что может не соответствовать вашему редактору. Просто скажите «нет» вкладкам. Большинство редакторов позволяют автоматически заменять их пробелами.

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

21 голосов
/ 19 июня 2009

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

def test_function() :
   if 5 > 3 :
   print "hello"

В вашем файле также может быть сочетание пробелов и пробелов.

Я предлагаю вам использовать редактор с поддержкой синтаксиса Python, например PyScripter или Netbeans

17 голосов
/ 21 сентября 2011

Запустите ваш код с опцией -tt, чтобы выяснить, используете ли вы табуляции и пробелы непоследовательно

14 голосов
/ 19 июня 2009

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

Хотя вы можете использовать вкладки с Python, смешивая вкладки и пробел, как правило, приводит к ошибке, которую вы испытываете. Замена табуляции на 4 пробела является рекомендуемым подходом для написания кода Python.

8 голосов
/ 19 июня 2009

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

6 голосов
/ 15 марта 2017

Если вы пишете Python с использованием Sublime и получаете ошибки отступа,

просмотр -> отступ -> преобразовать отступ в пробелы

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

3 голосов
/ 17 января 2017

Эта ошибка также может возникать при вставке чего-либо в интерпретатор Python (терминал / консоль).

Обратите внимание, что интерпретатор интерпретирует пустую строку как конец выражения, поэтому, если вы вставите что-то вроде

def my_function():
    x = 3

    y = 7

интерпретатор будет интерпретировать пустую строку перед y = 7 как конец выражения, т. Е. Когда вы закончили определять свою функцию, а следующая строка - y = 7 будет иметь неправильный отступ, поскольку это новое выражение.

3 голосов
/ 16 сентября 2013

Убедитесь, что вы используете опцию «вставить пробелы вместо табуляции» в вашем редакторе. Затем вы можете выбрать желаемую ширину вкладки, например 4. Эти параметры вы можете найти в gedit в разделе edit -> settings -> editor.

Нижняя строка: ИСПОЛЬЗОВАТЬ ПРОСТРАНСТВА, а не вкладки

2 голосов
/ 11 февраля 2016

Просто скопируйте ваш скрипт и поместите под "" "весь ваш код" "" ...

указать эту строку в переменной .. как,

a = """ your python script """
print a.replace('here please press tab button it will insert some space"," here simply press space bar four times")
# here we replacing tab space by four char space as per pep 8 style guide..

теперь выполняйте этот код в Sublime Editor, используя Ctrl + B, теперь он будет печатать код с отступом в консоли. это все

2 голосов
/ 19 июня 2009

Есть трюк, который всегда работал для меня:

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

Это случилось со мной, когда я использовал vim, gedit или подобные редакторы.

Попробуйте использовать только 1 редактор для вашего кода.

...