IndentationError: unindent не соответствует ни одному внешнему уровню отступа

585

Когда я компилирую код Python ниже, я получаю

IndentationError: unindent не соответствует ни одному внешнему уровню отступа


import sys

def Factorial(n): # Return factorial
    result = 1
    for i in range (1,n):
        result = result * i
    print "factorial is ",result
    return result

Почему?

cbrulak
источник
7
и, вероятно, диапазон (1, n + 1) будет лучше, если вы захотите включить 'n' в свои вычисления :-)
Abgan
7
У меня была такая же ошибка, но я случайно отступа по методу путь в коде немного влево, который дал эту ошибку в нижней части следующего метода после него. Так что эта ошибка может возникать не только при смешивании табуляции и пробелов.
Проф. Фалькен нарушил контракт
14
Я использую Sublime Text 3. У меня есть проект Django. Я исправил ошибку с помощьюView > Indentation > Intent Using Spaces
AbhimanyuAryan
Если бы эта проблема была в pycharm, настройка вкладок и интервалов в конфигах не работала. Проблема заключалась в том, что у меня был файл ~ / .editorconfig, который переопределял конфигурацию pycharm.
Кен Майерс
Я обнаружил, что использование IDLE значительно облегчает поиск проблем с отступами. Это ясно найдет ошибки отступа, которые не найдет большинство редакторов.
Деннис Гатаггу

Ответы:

670

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

Попробуй это:

import sys

def Factorial(n): # return factorial
    result = 1
    for i in range (1,n):
        result = result * i
    print "factorial is ",result
    return result

print Factorial(10)
Кевин Тиг
источник
2
да, я должен был действительно пробел над внутренней частью цикла в последних двух строках (только в SO). Не уверен почему ...
cbrulak
3
моя первая строка, "result = 0" (которая должна была быть 1, спасибо за исправление), была разделена, в то время как остальные были табулированы, черт, я не знал, что python был таким
cbrulak
1
Да, это может быть сложно. Я использую emacs для редактирования python, и у меня есть его настройка, чтобы всегда заменять вкладки пробелами в файлах py, чтобы у меня не было этой проблемы. Notepad ++ также может иметь такую ​​опцию.
Кевин Тайге
3
Получил ту же проблему, атм :). SublimeText показывает пробелы в виде точек, это довольно полезно.
Крис
Так что держитесь, вы можете сделать отступ с пробелами ИЛИ вкладками. тебе просто нужно быть согласным? бьет головой
Дэвид
265

ВНИМАНИЕ : Пробелы предпочтительный метод - см PEP008 Отступ и табуляции или пробелы?, (Спасибо @Siha за это.)

За Sublime Text пользователей:

Установите Sublime Textдля использования вкладок для отступа: View ->Indentation ->Convert Indentation to Tabs

Снимите Indent Using Spacesфлажок и в том же подменю выше. Это немедленно решит эту проблему.

activatedgeek
источник
1
Кроме того, всякий раз, когда вы используете Python, убедитесь, что вы установили аналогичную опцию в любой IDE / текстовом редакторе, который вы используете
activgeek
20
Также в ATOM, Пакеты> Пробелы> Преобразовать пробелы во вкладки, и вы избежите головной боли Python по синтаксической ошибке!
loretoparisi
1
Пробелы предпочтительный метод - см PEP008 Отступы и вкладки или пробелы? , Sublime также может быть настроен таким образом.
SiHa
13
Вы говорите, что пробелы - предпочтительный метод, но в вашем ответе люди просят возвышенных использовать вместо них вкладки! Я в замешательстве
Гота
@NunoCalaim К сожалению, это случилось после того, как я ответил на вопрос. Если вы начинаете новый проект, пожалуйста, используйте предпочтительную технику пробелов. Вот почему я внес изменения, выделенные жирным шрифтом, чтобы все новички знали об отказе от ответственности.
activatedgeek
137

Чтобы легко проверить наличие проблем с табуляцией / пробелами, вы можете сделать это:

python -m tabnanny yourfile.py

или вы можете просто правильно настроить редактор :-)

Андре
источник
1
Я пробовал это в файле с некоторой ошибкой отступа табуляции / пробела, но не выводил вообще с неправильным файлом табуляции. Есть идеи?
Luchux
1
У меня была проблема с пробелами, и ошибка сказала, что это было в строке 191, но благодаря tabnanny я обнаружил, что настоящая проблема была не в этой строке, а в строке выше.
richar8086
Спасибо! Какой отличный совет. Ошибка была обнаружена flake8 в VS Code, но она не могла определить, где была проблема - Табнанни сделал за микросекунду.
Стив
39

Вы уверены, что не смешиваете табуляции и пробелы в пустом пространстве отступа? (Это приведет к этой ошибке.)

Обратите внимание, что вы не должны использовать вкладки в коде Python. Смотрите руководство по стилю . Вы должны настроить Notepad ++ для вставки пробелов для вкладок.

Zdan
источник
Я смущен. В ответе выше говорится о том, чтобы переключить опцию текстового редактора, чтобы использовать пробелы вместо пробелов.
Спурра
3
@BananaCode Пока вы используете ТОЛЬКО вкладки или ТОЛЬКО пробелы, технически не имеет значения, какой вы выберете. Хотя для python пробелы предпочтительнее, смотрите ссылку, на которую я ссылался.
Здан
21

Всякий раз, когда я сталкивался с этой ошибкой, это потому, что я как-то перепутал табуляции и пробелы в моем редакторе.

Dana
источник
13

Если вы используете редактор IDLE в Python, вы можете сделать то, что предлагает в одном из похожих сообщений об ошибках:

1) выбрать все, например Ctrl+A

2) Перейти в Формат -> Untabify Region

3) Проверьте правильность отступов, сохраните и перезапустите программу.

Я использую Python 2.5.4

Gatica
источник
9

Если вы используете Vim, нажмите escape и наберите

гг = G

Это авто выравнивает все и очищает любые пробелы, которые вы добавили.

cbartondock
источник
8

Строка: result = result * iдолжна быть с отступом (это тело цикла for).

Или - у вас смешанные символы пробела и табуляции

Abgan
источник
Мне пришлось изменить редактирование в SO, странно. Смотрите мою обновленную заметку «Редактировать» в вопросе
cbrulak
Итак, я считаю, что вторая строка моего ответа верна - у вас смешанные пробелы и символы табуляции (32 и 8 в ASCII соответственно)
Абган
5

На атом

перейти к

Packages > Whitespace > Convert Spaces to Tabs

Затем проверьте еще раз отступ файла:

python -m tabnanny yourFile.py

или

>python
>>> help("yourFile.py")
loretoparisi
источник
4

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

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

Кроме того, внедрение кода с вставленной копией является распространенным источником проблем такого типа.

Мэтт Кал
источник
4

Если вы используете notepad ++, выполните «замену» расширенным режимом поиска, чтобы найти \ t, и замените его четырьмя пробелами.

Джеки Ли
источник
2

для пользователей Atom, Packages ->whitspace -> remove trailing whitespaces это сработало для меня

Ага
источник
2

Просто дополнение. У меня была похожая проблема с обоими отступами в Notepad ++.

  1. Неожиданный отступ
  2. Внешний уровень отступа

    Перейдите на ----> вкладку Поиск ----> нажмите на замену ----> нажмите кнопку с зависимой фиксацией, расположенную ниже ---> Теперь замените \ t на четыре пробела

    Перейдите на ----> вкладку Поиск ----> нажмите на замену ----> нажмите кнопку с зависимой фиксацией Расширенные возможности ---> Теперь замените \ n ничем

Jumpman
источник
2

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

Cur123
источник
2

Для пользователей Spyder выберите Source> Fix Indentation, чтобы немедленно решить проблему

Хафиз Абдулбасит
источник
1

Это может быть из-за того, что функция над ней не имеет одинакового отступа. т.е.

class a:
    def blah:
      print("Hello world")
    def blah1:
      print("Hello world")
Али
источник
1

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

user3731311
источник
1

Поскольку я понимаю, что нет конкретного ответа spyder, я добавлю один: в основном, внимательно посмотрите на ваше ifутверждение и убедитесь, что все if, elifи elseимеют одинаковый интервал, что они находятся в одной строке в начале следующим образом:

def your_choice(answer):
    if answer>5:
        print("You're overaged")
    elif answer<=5 and answer>1: 
            print("Welcome to the toddler's club!")
    else:
            print("No worries mate!")
NelsonGon
источник
1

Я определил функцию, но у нее не было никакого контента, кроме комментариев к функции ...

def foo(bar):
    # Some awesome temporary comment.
    # But there is actually nothing in the function!
    # D'Oh!

Он кричал:

  File "foobar.py", line 69

                                ^
IndentationError: expected an indented block

(обратите внимание, что линия, на которую ^указывает отметка, пуста)

-

Несколько решений:

1: Просто закомментируйте функцию

2: Добавить функциональный комментарий

def foo(bar):
    '' Some awesome comment. This comment could be just one space.''

3: Добавить строку, которая ничего не делает

def foo(bar):
    0

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

Седрик
источник
Заявление передачи может быть полезным там :)
KevinG
1

Во-первых, просто чтобы напомнить вам, что есть логическая ошибка, вам лучше оставить результат = 1, иначе ваш результат будет равен = 0 даже после запуска цикла.

Во-вторых, вы можете написать это так:

import sys

def Factorial(n): # Return factorial
  result = 0
  for i in range (1,n):
     result = result * i

  print "factorial is ",result
  return result

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

Фейсал Ахмед Фарук
источник
1

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

class junk: 
     """docstring is indented too much""" 
    def fun(): return   

IndentationError: unindent does not match any outer indentation level

plfrick
источник
это исправило мою проблему
bhordupur
0

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

Или попробуйте написать это:

#!/usr/bin/python -tt

в начале кода. Эта строка разрешает любые различия между символами табуляции и пробелами.

Эрагон
источник
0

в моем случае проблема была в настройке pydev на Eclipse

pydev @ Eclipse

Руи Мартинс
источник
0

Если вы используете редактор Komodo, вы можете сделать то, что предлагает в одном из похожих сообщений об ошибках:

1) выберите все, например, Ctrl + A

2) Перейти к коду -> Untabify Region

3) Проверьте правильность отступов, сохраните и перезапустите программу.

Я использую Python 3.4.2

Имтиаз Пабель
источник
0

Если вы используете Sublime text для разработки на python, вы можете избежать ошибки, используя пакет Anaconda. После установки Anaconda,

  1. откройте ваш файл в возвышенном
  2. щелкните правой кнопкой мыши на открытых пространствах
  3. выбрать анаконду
  4. нажмите на автоформат
  5. СОВЕРШЕНО Или нажмите CTRL + ALT + R.
Kapilfreeman
источник
0

В intellij с плагином python, Ctrl + Shift + Alt для переформатирования документа исправили проблему отступа / табуляции / пробелов

Рене Фергюсон
источник
0

Для пользователей SPYDER : я использую spyder 3.3.2 с python 3.7.1, и я решил эту проблему, установив отступ для использования вкладок, выполнив следующие шаги:

  • Инструменты.
  • Настройки.
  • Редактор.
  • Расширенные настройки.
  • Отступы символов -> Вкладки.

Затем я сбросил «неопознанную» строку, используя клавишу табуляции.

Почему-то без этой настройки я иногда получал призрачный IndentationError.

Майк
источник
0

Например:

1. def convert_distance(miles):
2.   km = miles * 1.6
3.   return km

В этом коде та же самая ситуация произошла для меня. Просто удалите предыдущие отступы в строках 2 и 3, а затем используйте табуляцию или пробел. Никогда не используйте оба . Дайте правильный отступ при написании кода на Python. Для Spyder перейдите в Source> Fix Indentation. То же самое касается кода VC и возвышенного текста или любого другого редактора. Исправьте отступ.

Аюш Ариан
источник
-6

Это происходит главным образом из-за редактора. Попробуйте изменить табуляцию на пробелы (4). Лучшая среда разработки, дружественная Python, или Editors - это pycharm, sublime, vim для linux.
даже я тоже сталкивался с той же проблемой, позже я обнаружил, что есть проблема с кодировкой. Я предлагаю вам слишком изменить ваш редактор.

Юнуса
источник