IndentaError: unindent не відповідає жодному зовнішньому рівню відступу


584

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

IndentaError: 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

Чому?


7
і, ймовірно, діапазон (1, n + 1) буде кращим, якщо ви хочете включити 'n' у свій обчислення :-)
Абган

7
У мене була така ж помилка, але мені трапилось відзначити спосіб введення коду трохи ліворуч, який дав цю помилку внизу наступного методу після неї. Тож ця помилка може виникнути не лише при змішуванні вкладок та пробілів.
Контракт професора Фолкена порушив

14
Я використовую Sublime Text 3. У мене є проект Django. Я виправив помилку за допомогоюView > Indentation > Intent Using Spaces
АбхіманьяАрійського

Якби ця проблема не була в pycharm, коригування вкладок і пробілів у налаштуваннях не працювало. Проблема полягала в тому, що у мене був файл ~ / .editorconfig, який переосмислював конфігурацію pycharm.
Кен Майерс

Я виявив, що за допомогою IDLE значно простіше знайти проблеми з відступом. Він чітко знайде помилки відступу, які не знайде більшість редакторів.
Денніс Гатагу

Відповіді:


668

Інші афіші, ймовірно, вірні ... Можливо, у ваших вкладках можуть бути пробіли. Спробуйте здійснити пошук і замінити, щоб замінити всі вкладки на кілька пробілів.

Спробуйте це:

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
мій перший рядок, "результат = 0" (який повинен був 1, спасибі за виправлення) був розміщений, а решта була вкладена, чорт, не знала, що python був таким
cbrulak

1
Так, це може бути хитро. Я використовую emacs для редагування python, і у мене він налаштований завжди замінювати вкладки пробілами у py-файлах, щоб у мене не виникло цієї проблеми. Блокнот ++ може також мати такий варіант.
Кевін Тіге

3
Маю ту саму проблему atm :). SublimeText показує пробіли у вигляді крапок, що досить корисно.
Крис

Тож тримайте на ньому можна відступити пробілами АБО вкладками. вам просто потрібно бути незмінним? чубчик голови
Девід,

265

ВАЖЛИВО : Проміжки є кращим методом - див. PEP008 Відступ та вкладки чи пробіли? . (Дякую @Siha за це.)

Для Sublime Textкористувачів:

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

Зніміть прапорець Indent Using Spacesу цьому ж підменю вище. Це негайно вирішить це питання.


1
Крім того, кожного разу , коли з допомогою Python, переконайтеся , що ви встановили подібний варіант в залежності від того , IDE / текстовий редактор ви використовуєте
activatedgeek

20
Також на ATOM, пакети> пробіли> Перетворення просторів на вкладки, і ви уникнете головного болю з синтаксисом помилки Python!
loretoparisi

1
Пробіли є кращим методом - див. PEP008 Відступ та вкладки чи пробіли? . Підвищене також може бути налаштоване так, щоб це було зроблено в такий спосіб.
SiHa

13
Ви кажете, що пробіли є кращим методом, але Ваша відповідь просить людей запитати піднесене, щоб замість них використовувати вкладки! Я розгублений
gota

@NunoCalaim Ну, на жаль, це сталося після того, як я відповів на питання. Якщо ви починаєте новий проект, будь ласка, використовуйте бажану техніку пробілів. Тому я змінив жирний шрифт, щоб будь-які новачки знали про відмову.
activatedgeek

137

Щоб легко перевірити проблеми з вкладками / пробілами, ви можете це зробити:

python -m tabnanny yourfile.py

або ви, звичайно, можете правильно налаштувати свого редактора :-)


1
Я спробував це у файлі з деякою помилкою відступу вкладки / пробілу, але взагалі немає виводу з неправильним файлом вкладки. будь-яка ідея?
Luchux

1
У мене виникли проблеми з пробілами, і помилка сказала, що це було на лінії 191, але завдяки табнанні я виявив, що справжня проблема полягає не в цій лінії, а в рядку вище.
richar8086

Дякую! Яка чудова порада. Помилка була визначена flake8 у коді VS, але вона не змогла визначити, де проблема - табнанний зробив у мікросекунді.
Стів

39

Ви впевнені, що не змішуєте вкладки та пробіли у пробілі з відступом? (Це призведе до цієї помилки.)

Зауважте, рекомендується не використовувати вкладки в коді Python. Дивіться посібник зі стилів . Ви повинні налаштувати Notepad ++ для вставки пробілів для вкладок.


Я збентежений. У відповіді вище зазначено, щоб переключити текстовий редактор, щоб використовувати вкладки замість пробілів.
шпора

3
@BananaCode Поки ви використовуєте ТОЛЬКІ вкладки або ТІЛЬКИ пробіли, технічно це не має значення, який ви обираєте. Хоча для python кращі пробіли, дивіться посилання, на яке я посилався.
zdan

21

Щоразу, коли я стикався з цією помилкою, це тому, що я якось переплутав вкладки та пробіли у своєму редакторі.


13

Якщо ви використовуєте редактор IDLE Python, ви можете зробити так, як це запропоновано в одному з подібних повідомлень про помилки:

1) виберіть усі, наприклад Ctrl+A

2) Перейдіть у формат -> Untabify Region

3) Двічі перевірте, чи відступ відступів все-таки є правильним, збережіть і повторно перевірте програму.

Я використовую Python 2.5.4


9

Якщо ви використовуєте Vim, натисніть клавішу escape та введіть

gg = G

Це автоматичне відступ все і очистить усі проміжки, які ви кинули.


8

Рядок: result = result * iмає бути відступним (це тіло для циклу).

Або - у вас змішаний пробіл та символи вкладки


Мені довелося змінити редагування на ТАК, дивно. Дивіться мою оновлену примітку "Редагувати" у запитанні
cbrulak

Гаразд, тому я вважаю, що другий рядок моєї відповіді правильний - у вас змішані символи пробілу та вкладки (32 та 8 відповідно в ASCII)
Абган

5

На Атом

йти до

Packages > Whitespace > Convert Spaces to Tabs

Потім ще раз перевірте відступ файлу:

python -m tabnanny yourFile.py

або

>python
>>> help("yourFile.py")

4

Схоже, це проблема з відступом. Ви не повинні відповідати фігурні дужки в Python , але ви дійсно повинні відповідати рівнів відступу.

Найкращий спосіб запобігти проблемам з пробілом та вкладками - це відображення невидимих ​​символів у текстовому редакторі. Це дасть вам швидкий спосіб запобігти та / або усунути помилки, пов’язані з відступом.

Крім того, введення вставленого копіюваного коду є загальним джерелом для такого типу проблем.


4

Якщо ви використовуєте блокнот ++, виконайте "заміну" розширеним режимом пошуку, щоб знайти \ t та замінити чотири пробіли.


2

для користувачів Atom, Packages ->whitspace -> remove trailing whitespaces це працювало для мене


2

Просто доповнення. У мене була аналогічна проблема з обома відступами в Notepad ++.

  1. Невиконаний відступ
  2. Зовнішній рівень відступу

    Перейдіть до ----> Вкладка пошуку ----> натисніть на заміну ----> натисніть перемикач Розширений внизу ---> Тепер замініть \ t чотирма пробілами

    Перейдіть до ----> Вкладка пошуку ----> натисніть кнопку Замінити ----> натисніть радіо-кнопку Розширений внизу ---> Тепер замініть \ n нічого


2

Я використовував ноутбук Jupyter і намагався майже всі перераховані вище рішення (адаптуючись до мого сценарію) без жодної користі. Потім я пішов рядок за рядком, видалив усі пробіли для кожного рядка і замінив вкладку. Це вирішило питання.



1

Це може бути тому, що функція, що знаходиться над нею, не розрізана однаково. тобто

class a:
    def blah:
      print("Hello world")
    def blah1:
      print("Hello world")

1

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


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!")

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

Наскільки це варте, мій docstring був відступ занадто сильним, і це також призводить до тієї ж помилки

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

IndentationError: unindent does not match any outer indentation level



0

Це відбувається тому, що відбувається змішування як вкладок, так і пробілів. Можна або видалити всі пробіли, і замінити їх вкладками.

Або спробуйте написати це:

#!/usr/bin/python -tt

на початку коду. Цей рядок вирішує будь-які відмінності між вкладками та пробілами.



0

Якщо ви використовуєте редактор Komodo, ви можете зробити так, як це запропоновано в одному з подібних повідомлень про помилки:

1) виберіть усі, наприклад Ctrl + A

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

3) Двічі перевірте, чи відступ відступів все-таки є правильним, збережіть і повторно перевірте програму.

Я використовую Python 3.4.2


0

Якщо ви використовуєте текст Sublime для розробки python, ви можете уникнути помилки, скориставшись пакетом Anaconda. Після встановлення Anaconda,

  1. відкрити свій файл піднесено
  2. клацніть правою кнопкою миші на відкритих просторах
  3. вибирайте анаконду
  4. натисніть на автоформат
  5. Зроблено або натисніть CTRL + ALT + R.

0

У Intellij з плагіном python Ctrl + Shift + Alt для переформатування документа виправлено відступ / вкладку / пробіли


0

Для користувачів SPYDER : я використовую шпигун 3.3.2 з python 3.7.1, і я вирішив це, встановивши відступ для використання вкладок, виконавши наступні кроки, натисніть на:

  • Інструменти.
  • Вподобання.
  • Редактор.
  • Розширені налаштування.
  • Знаки відступу -> Вкладки.

Потім я скидаю "нерозподілений" рядок за допомогою клавіші табуляції.

Чомусь без цього налаштування я часом отримував привид IndentaError.


0

Наприклад:

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

У цьому коді зі мною трапилась така ж ситуація. Просто видаліть попередні проміжки відступу рядків 2 та 3, а потім використовуйте вкладку чи пробіл. Ніколи не використовуйте обидва . Дайте належний відступ під час написання коду в python. Для Spyder goto Source> Виправити відступ. Те саме стосується Кодексу ВК та піднесеного тексту чи будь-якого іншого редактора. Зафіксуйте відступ.


-6

Це відбувається головним чином через редактора. Спробуйте змінити вкладки на пробіли (4). Найкращими IDE або редакторами, зручними для python, є pycharm, sublime, vim для linux.
навіть я теж стикався з тією ж проблемою, пізніше я виявив, що існує проблема кодування. Я пропоную вам занадто змінити редактор ур.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.