Що робити з "Несподіваним відступом" в python?


117

Як виправити помилку "несподіваний відступ" у python?


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

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

Неясне запитання та відповідь не обрано.
rafael.js

"Як виправити помилку ..."? Визначивши, де це сталося, та встановивши причину помилки. У цьому випадку, зробивши відступ цієї конкретної лінії схожим на те, чого очікує Python ...
twalberg

Відповіді:


132

Python використовує пробіли на початку рядка, щоб визначити, коли кодові блоки починаються та закінчуються. Помилки, які ви можете отримати:

Несподіваний відступ. Цей рядок коду має більше пробілів на початку, ніж попередній, але попередній не є початком підблока (наприклад, if / while / для оператора). Усі рядки коду в блоці повинні починатися з точно однакового рядка пробілів. Наприклад:

>>> 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 / для оператора, визначення функції).

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

Якщо ви хочете функцію, яка нічого не робить, скористайтеся командою пропуску "без опції" :

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

Змішування вкладок і пробілів дозволено (принаймні, в моїй версії Python), але Python передбачає, що вкладки мають довжину 8 символів, що може не відповідати вашому редактору. Просто скажіть "ні" на вкладках. Більшість редакторів дозволяють автоматично їх замінювати пробілами.

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


7
гарне пояснення. Крім того, я також витратив несподівану помилку з відступом, коли він змішував пробіли з "вкладкою" та "пробілом" у NotePad ++, замінював "вкладку" на "пробіли" та виправляв.
Хосе Росас Саенц

2
@ JoséRosasSáenz Ваш коментар врятував мені стільки неприємностей
користувач3726345

Ще однією причиною є відсутність exceptчастини tryпункту. Код виглядає правильно (в тому випадку, що неозначений рядок має бути поза tryблоком), але Python повідомляє про це як про помилку "несподіваного відступу". Це виправлено, додавши except, можливо, використовуючи pass(як тут )
dumbledad

@dumbledad На якій версії python ви бачите це? Коли я приміряю на себе (2.7.15 та 3.6.8), я отримую SyntaxError
Аліса Перселл,

Я зіткнувся з цією помилкою, коли копіював / вставляв код з веб-сайту. Позиціонування виявилося нормальним, але мені потрібно було видалити пробіл та повторно застосувати пробіли до того, як 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, все ще має цей мертвий мозок, втрачає час.
Ешелон

Я ненавмисно переключив редакторів на півдорозі, написавши свій код, і це запхнуло мої відступи в новіший код. Зміна не була очевидною для очей, але перекладач не запустив мій код. Ця публікація допомогла мені знайти проблему.
Люсьєн Сталс

21

Запустіть свій код за допомогою параметра -tt, щоб дізнатись, чи використовуєте вкладки та пробіли непослідовно


16

Увімкніть видимий пробіл у будь-якому редакторі, який ви використовуєте, і увімкніть заміну вкладок пробілами.

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


1
Як ви конкретно це робите? Я використовую Sublime.
чиболе

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, тепер він буде друкувати відступний код у консолі. Це воно


як запустити код. Чи потрібно буде видалити "" "і" "" та друк a.replace і запустити його нормально?
чиболе

ні "" "" "" (потрійні лапки) не посилаються на ваш вміст, а не на рядок. його потрібно, тому що ваш код може містити рядок, який є однократними / подвійними лапками, тому необхідні "" "
Mohideen bin Mohammed

2

Все, що вам потрібно зробити, - це видалити пробіли або пробіли з вкладками з початку наступних кодів

from django.contrib import admin

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

2

Виконайте таку команду, щоб вирішити її:

autopep8 -i <filename>.py

Це оновить ваш код і вирішить усі помилки відступу :)

Сподіваюся, це вирішить


Дуже простий у виконанні. Працює для мене щоразу, тому я поділився, сподіваюся, комусь вигідно :)
Шаряр Вохра

1

Блокнот ++ надав правильний простір на вкладках, але проблема з відступом нарешті була знайдена в текстовому редакторі Sublime.

Використовуйте текстовий редактор Sublime і переходьте по рядку


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.