Ошибка отступления:без отступа не соответствует ни одному уровню внешнего отступа
-
20-08-2019 - |
Вопрос
Когда я компилирую приведенный ниже код Python, я получаю
Ошибка отступления:без отступа не соответствует ни одному уровню внешнего отступа
import sys
def Factorial(n): # Return factorial
result = 1
for i in range (1,n):
result = result * i
print "factorial is ",result
return result
Почему?
Решение
Другие плакаты, вероятно, верны...в ваших табуляциях могут быть пробелы.Попробуйте выполнить поиск и замену, чтобы заменить все табуляции несколькими пробелами.
Попробуй это:
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)
Другие советы
ВАЖНЫЙ: Предпочтительным методом являются пробелы - смотрите PEP008 Отступ и Табуляции или Пробелы?.(Спасибо @Siha за это.)
Для Sublime Text
Пользователи:
Установить Sublime Text
использовать табуляции для отступов:View
--> Indentation
--> Convert Indentation to Tabs
Снимите флажок Indent Using Spaces
опция также находится в том же подменю выше.Это немедленно решит эту проблему.
Чтобы легко проверить наличие проблем с табуляциями / пробелами, вы действительно можете сделать это:
python -m tabnanny yourfile.py
или вы можете просто правильно настроить свой редактор, конечно :-)
Вы уверены, что не смешиваете табуляции и пробелы в вашем пустом пространстве для отступов?(Это вызовет эту ошибку.)
Обратите внимание, рекомендуется не использовать вкладки в коде Python.Смотрите на руководство по стилю.Вы должны настроить Notepad ++ для вставки пробелов для табуляций.
Всякий раз, когда я сталкивался с этой ошибкой, это происходило из-за того, что я каким-то образом перепутал табуляции и пробелы в своем редакторе.
Если вы используете редактор IDLE в Python, вы можете сделать, как это предлагается в одном из похожих сообщений об ошибках:
1) выберите все, например Ctrl + A
2) Перейдите в Форматирование -> Отменить табуляцию региона
3) Дважды проверьте правильность вашего отступа, сохраните и повторно запустите вашу программу.
Я использую Python 2.5.4
Линия: result = result * i
должен быть сделан отступ (это тело цикла for).
Или - вы перепутали символы пробела и табуляции
Если вы используете Vim, нажмите escape, а затем введите
gg=G
Это автоматически сделает все отступы и очистит все пробелы, которые вы добавили.
Похоже, проблема с отступом.Вам не обязательно сопоставлять фигурные скобки в Python, но вы делай должны соответствовать уровням отступов.
Лучший способ предотвратить проблемы с пробелами и табуляцией - это отображать невидимые символы в вашем текстовом редакторе.Это даст вам быстрый способ предотвратить и / или устранить ошибки, связанные с отступами.
Кроме того, внедрение скопированного кода является распространенным источником проблем такого типа.
Если вы используете notepad ++, выполните "замену" в режиме расширенного поиска, чтобы найти и заменить четырьмя пробелами.
На Атом
перейти к
Packages > Whitespace > Convert Spaces to Tabs
Затем проверьте еще раз отступ вашего файла:
python -m tabnanny yourFile.py
или
>python
>>> help("yourFile.py")
для пользователей Atom, Packages ->whitspace -> remove trailing whitespaces
это сработало для меня
Просто дополнение.У меня была аналогичная проблема с обоими отступами в Notepad ++.
- Незамеченное углубление
Уровень внешнего Углубления
Перейдите к ----> Вкладка поиска ----> нажмите на заменить ----> нажмите на переключатель Расширенный ниже ---> Теперь замените четырьмя пробелами
Перейдите к ----> Вкладка поиска ----> нажмите на заменить ----> нажмите на переключатель Расширенный ниже ---> Теперь замените ничем
Вчера у меня была такая же проблема, это была ошибка отступа, я использовал текстовый редактор sublime.у меня ушло несколько часов на то, чтобы исправить это, и в конце концов я скопировал код в текстовый редактор VI, и он просто отлично заработал.ps python слишком чувствителен к пробелам, убедитесь, что не смешиваете пробел и табуляцию.
Поскольку я понимаю, что нет конкретного ответа на 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!")
У меня была определена функция, но она не имело никакого содержания помимо комментариев к его функциям...
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
(обратите внимание, что строка the ^
отметить точки на пусто)
--
Множество решений:
1:Просто закомментируйте функцию
2:Добавить комментарий к функции
def foo(bar):
'' Some awesome comment. This comment could be just one space.''
3:Добавить строку, которая ничего не делает
def foo(bar):
0
В любом случае, убедитесь, что сделайте это очевидным почему это пустая функция - для вас самих или для ваших коллег, которые будут использовать ваш код
Я использовал Jupyter notebook и перепробовал почти все вышеперечисленные решения (адаптированные к моему сценарию) безрезультатно.Затем я прошелся строка за строкой, удалил все пробелы для каждой строки и заменил на tab.Это решило проблему.
Во-первых, просто чтобы напомнить вам о наличии логической ошибки, вам лучше сохранить result = 1, иначе ваш результат будет result = 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, то вы можете понять, почему мы должны оставить строку.
Это может быть связано с тем, что функция над ней имеет другой отступ.т. е.
class a:
def blah:
print("Hello world")
def blah1:
print("Hello world")
Это происходит потому, что происходит путаница как табуляции, так и пробелов.Вы можете либо удалить все пробелы, либо заменить их табуляциями.
Или, Попробуйте написать это:
#!/usr/bin/python -tt
в начале кода.Эта строка устраняет все различия между табуляциями и пробелами.
в моем случае проблема заключалась в конфигурации pydev в Eclipse
Если вы используете Komodo editor, вы можете поступить так, как это предлагается в одном из подобных сообщений об ошибках:
1) выберите все, напримерCtrl + A
2) Перейдите в Code -> Untabify Region (Код -> Отключить регион)
3) Дважды проверьте правильность вашего отступа, сохраните и повторно запустите вашу программу.
Я использую Python 3.4.2
Если вы используете Sublime text для разработки на python, вы можете избежать ошибки, используя пакет Anaconda.После установки Anaconda,
- откройте свой файл в sublime
- щелкните правой кнопкой мыши на открытых пространствах
- выбирай анаконду
- нажмите на автоформат
- ГОТОВО Или нажмите CTRL + ALT + R.
Как бы то ни было, моя строка документа имела слишком большой отступ, и это также выдает ту же ошибку
class junk:
"""docstring is indented too much"""
def fun(): return
IndentationError: unindent does not match any outer indentation level
В intellij с плагином python Ctrl + Shift + Alt для переформатирования документа исправлена проблема с отступом / табуляцией / пробелами
Для СПАЙДЕР Пользователи:Я использую spyder 3.3.2 с python 3.7.1, и я решил эту проблему, установив отступ для использования вкладок, выполнив следующие действия, нажмите на:
- Инструменты.
- Предпочтения.
- Редактор.
- Расширенные настройки.
- Символы отступа -> Вкладки.
Затем я сбрасываю "неидентифицированную" строку с помощью клавиши tab.
По какой-то причине, без этой настройки, я получил призрак Иногда ошибка отступления.
Это происходит в основном из-за редактора .Попробуйте заменить табуляции пробелами (4). лучшие IDE или редакторы, дружественные к python, - pycharm , sublime , vim для Linux.
даже я тоже столкнулся с такой же проблемой, позже я обнаружил, что есть проблема с кодировкой. я предлагаю вам тоже сменить свой редактор.