Что делать с «неожиданным отступом» в Python?


117

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


4
Фрагмент кода, вызывающий ошибку, поможет нам лучше понять вашу проблему. Измените свой вопрос, включив в него код.
RBerteig

7
Для меня это звучит как проблема с пробелами, поэтому образец кода будет бесполезен.
Джеймс МакМахон,

Расплывчатый вопрос и не выбранный ответ.
rafael.js

«Как исправить ошибку ...»? Определив, где это произошло, и устранив причину ошибки. В этом случае, сделав отступ этой конкретной строки похожим на то, что ожидает Python ...
twalberg

Ответы:


132

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

Если вы хотите функцию , которая ничего не делает, использовать «не-оп» команду пропуск :

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

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

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


7
хорошее объяснение. Кроме того, я также потратил отступ. Неожиданная ошибка, когда он смешал пробелы с «табуляцией» и «пробелом» в NotePad ++, заменил «табуляцию» на «пробелы» и исправил.
Хосе Росас Саенс,

2
@ JoséRosasSáenz Ваш комментарий избавил меня от множества проблем
user3726345

Еще одна причина - отсутствие exceptчасти tryпредложения. Код выглядит правильно (в том смысле, что строка без отступа должна находиться за пределами tryблока), но Python сообщает об этом как об ошибке «неожиданного отступа». Это исправлено добавлением except, возможно, использованием pass(как здесь )
dumbledad

@dumbledad На какой версии Python вы это видите? Когда я пробую свой (2.7.15 и 3.6.8), я получаю SyntaxError
Alice Purcell

Я столкнулся с этой ошибкой при копировании / вставке кода с веб-сайта. Позиционирование выглядело нормально, но мне нужно было удалить пробелы и повторно применить их с использованием пробелов, прежде чем QGIS (3.10) запустит код.
Benj

23

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

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

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

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


1
Да, обязательно используйте редакторы, поддерживающие Python! У меня была проблема, когда я редактировал в блокноте ++ с настройками по умолчанию, и пробелы были неправильными
Дэйв Арчер,

2
смешанные табуляции и пробелы вызывают "SyntaxError: непоследовательное использование табуляции и пробелов в отступах"
SilentGhost

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

PyCharm может преобразовывать его последовательно. Также он выделит строки «неисправности». Я использую кавычки, потому что сейчас не 1960-е, и я не могу поверить, что в прекрасном языке, таком как Python, все еще есть этот мертвый мозг, отнимающий время.
Echelon

Я непреднамеренно сменил редактора на полпути к написанию кода, и он забил мои отступы в новом коде. Изменение не было очевидным для глаза, но интерпретатор не запускал мой код. Этот пост помог мне найти проблему.
Люсьен Сталс

21

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


16

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

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


1
Как конкретно вы это делаете? Я использую Sublime.
chibole

8

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


6

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

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

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


ох ... так это возвышенное вызывает это?
Нитин

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

У меня была такая же проблема с блокнотом ++. То, что показалось глазам правдой, потребовалось время, чтобы взломать это. Мне приходилось перемещать курсор по одному символу за раз, чтобы понять, что редактор преобразовал некоторые пробелы в табуляцию
Бхарат Ананд

4

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

нижняя строка: ИСПОЛЬЗУЙТЕ ПРОБЕЛЫ, а не вкладки


Ваша прибыль сделала свое дело!
Ник Див,

3

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

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

def my_function():
    x = 3

    y = 7

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


ключ существо , что пустые строки в пределах определения функции прекрасны, но они по- прежнему должны иметь начальный пробел , так как Python интерпретирует пустую строку в конце функции
MichaelChirico

3

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

Например, возьмем следующий сценарий:

def add_one(x):
    try:
        return x + 1
add_one(5)

Это возвращает, IndentationError: unexpected unindentкогда проблема, конечно же, заключается в отсутствии except:оператора.

Моя точка зрения: проверьте код выше, в котором сообщается о неожиданном (не) отступе!


2

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


2

У меня всегда срабатывала уловка:

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

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

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


2

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

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

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, теперь он будет печатать код с отступом в консоли. Это оно


как мне запустить свой код. Придется ли мне удалить "" "и" "", а печать заменить и запустить в обычном режиме?
chibole

нет "" "" "" (тройные кавычки) относятся к вашему контенту, а не к строке. это необходимо, потому что ваш код может содержать строку, состоящую из одинарных / двойных кавычек, поэтому требуется "" ".
Мохидин бин Мохаммед

2

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

from django.contrib import admin

# Register your models here.
from .models import Myapp
admin.site.register(Myapp)

2

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

autopep8 -i <filename>.py

Это обновит ваш код и решит все ошибки отступов :)

Надеюсь, это решит


Очень легко реализовать. Работает для меня каждый раз, поэтому я поделился, надеюсь, будет полезно для кого-то :)
Шарьяр Вохра

1

Notepad ++ давал правильное пространство вкладки, но проблема с отступом была наконец обнаружена в текстовом редакторе Sublime.

Используйте редактор Sublime text и переходите построчно


0

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

Step1 :Gives error 
L = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]
print(L[2: ])

Step2: L = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]print(L[2: ])

Step3: No error after space was removed
L = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]
print(L[2: ])
OUTPUT: [[7, 8, 9, 10]]

Спасибо!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.