Co zrobić z „nieoczekiwanym wcięciem” w Pythonie?

117

Jak naprawić błąd „nieoczekiwane wcięcie” w Pythonie?

Wentylator Macintosh
źródło
4
Fragment kodu, który powoduje błąd, pomoże nam lepiej zrozumieć Twój problem. Zmień swoje pytanie, aby dołączyć kod.
RBerteig
7
Brzmi to jak problem z białymi znakami, więc przykładowy kod byłby bezużyteczny.
James McMahon
Nieokreślone pytanie i brak odpowiedzi.
rafael.js
„Jak naprawić błąd…”? Identyfikując miejsce wystąpienia błędu i usuwając przyczynę błędu. W tym przypadku, sprawiając, że wcięcie tej konkretnej linii wygląda tak, jak oczekuje Python ...
twalberg

Odpowiedzi:

132

Python używa odstępów na początku wiersza, aby określić, kiedy zaczynają się i kończą bloki kodu. Błędy, które można uzyskać to:

Nieoczekiwane wcięcie. Ten wiersz kodu ma więcej spacji na początku niż poprzedni, ale poprzedni nie jest początkiem podbloku (np. Instrukcja if / while / for). Wszystkie wiersze kodu w bloku muszą zaczynać się dokładnie tym samym ciągiem białych znaków. Na przykład:

>>> def a():
...   print "foo"
...     print "bar"
IndentationError: unexpected indent

Ten jest szczególnie powszechny podczas interaktywnego uruchamiania Pythona: upewnij się, że nie wstawiasz żadnych dodatkowych spacji przed poleceniami. (Bardzo irytujące przy kopiowaniu i wklejaniu przykładowego kodu!)

>>>   print "hello"
IndentationError: unexpected indent

Niewcięcie nie pasuje do żadnego zewnętrznego poziomu wcięcia. Ten wiersz kodu ma mniej spacji na początku niż poprzedni, ale równie dobrze nie pasuje do żadnego innego bloku, którego mógłby być częścią. Python nie może zdecydować, dokąd zmierza. Na przykład w dalszej części, czy ostateczny wydruk ma być częścią klauzuli if, czy nie?

>>> if user == "Joey":
...     print "Super secret powers enabled!"
...   print "Revealing super secrets"
IndendationError: unindent does not match any outer indentation level

Oczekiwano bloku z wcięciem. Ta linia kodu ma na początku taką samą liczbę spacji jak poprzednia, ale ostatnia linia miała rozpocząć blok (np. Instrukcja if / while / for, definicja funkcji).

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

Jeśli chcesz funkcję, która nie robi nic, użyj „no-op” polecenia podanie :

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

Mieszanie tabulatorów i spacji jest dozwolone (przynajmniej w mojej wersji Pythona), ale Python zakłada, że ​​tabulatory mają długość 8 znaków, co może nie pasować do twojego edytora. Po prostu powiedz „nie” kartom. Większość redaktorów pozwala na automatyczne zastępowanie ich spacjami.

Najlepszym sposobem uniknięcia tych problemów jest zawsze używanie spójnej liczby spacji podczas wcięcia podbloku, a najlepiej użycie dobrego środowiska IDE, które rozwiąże problem za Ciebie. Dzięki temu Twój kod będzie bardziej czytelny.

Alice Purcell
źródło
7
dobre wytłumaczenie. Poza tym wydałem również nieoczekiwany błąd wcięcia, gdy mieszał spacje z 'tabulatorem' i 'spacją' w NotePad ++, zamień 'tab' na 'spacje' i naprawiłem.
José Rosas Sáenz
2
@ JoséRosasSáenz Twój komentarz zaoszczędził mi tyle kłopotów
user3726345
Brakuje jednej dodatkowej przyczyny w exceptczęści tryklauzuli. Kod wygląda dobrze (w tym sensie, że wiersz bez wcięcia ma znajdować się poza tryblokiem), ale Python zgłasza to jako błąd „nieoczekiwanego wcięcia”. Naprawiono to, dodając except, być może używając pass(tak jak tutaj )
dumbledad
@dumbledad W której wersji Pythona to widzisz? Kiedy próbuję na moim (zarówno 2.7.15, jak i 3.6.8), otrzymuję błąd SyntaxError
Alice Purcell
Napotkałem ten błąd podczas kopiowania / wklejania kodu ze strony internetowej. Pozycjonowanie wyglądało na prawidłowe, ale musiałem usunąć spacje i ponownie zastosować spacje, zanim QGIS (3.10) uruchomi kod.
benj
23

W Pythonie odstępy są bardzo ważne, ponieważ zapewniają strukturę bloków kodu. Ten błąd występuje, gdy zepsujesz strukturę kodu, na przykład w ten sposób:

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

Możesz również mieć w pliku kombinację tabulatorów i spacji.

Sugeruję użycie edytora obsługującego składnię Pythona, takiego jak PyScripter lub Netbeans

yanjost
źródło
1
Tak, zdecydowanie używaj edytorów obsługujących Pythona! Miałem problem z edytowaniem w notatniku ++ z domyślnymi ustawieniami i błędne wyświetlanie białych znaków
Dave Archer
2
mieszane tabulatory i spacje podnoszą „SyntaxError: niespójne użycie tabulatorów i spacji we wcięciach”
SilentGhost
Na wszelki wypadek wtyczka Python Netbeans obecnie nie konwertuje tabulatorów na spacje z istniejącego kodu. Jednak zrobi to podczas pisania nowego kodu.
James McMahon
PyCharm może go konsekwentnie konwertować. Podświetli również linie „winy”. Używam cytatów, ponieważ to nie są lata 60. i nie mogę uwierzyć, że cudowny język, taki jak Python, wciąż ma tę martwą mózg, marnującą czas wadę.
Echelon,
Nieumyślnie zmieniłem edytory w połowie pisania kodu i zapchałem moje wcięcia w nowszym kodzie. Zmiana nie była oczywista dla oka, ale interpreter nie uruchomił mojego kodu. Ten post pomógł mi znaleźć problem.
Lucien Stals
21

Uruchom swój kod z opcją -tt, aby dowiedzieć się, czy niekonsekwentnie używasz tabulatorów i spacji

Manoj I
źródło
16

Włącz widoczne spacje w dowolnym używanym edytorze i włącz zastępowanie tabulatorów spacjami.

Chociaż możesz używać tabulatorów z Pythonem, mieszanie tabulatorów i spacji zwykle prowadzi do napotkanego błędu. Zastąpienie tabulatorów 4 spacjami jest zalecanym podejściem do pisania kodu w Pythonie.

James McMahon
źródło
1
Jak konkretnie to robisz? Używam Sublime.
chibole
8

Używając odpowiednich wcięć. Python jest świadomy białych znaków, więc musisz postępować zgodnie z jego wskazówkami dotyczącymi wcięć bloków, w przeciwnym razie otrzymasz błędy wcięć.

workmad3
źródło
6

Jeśli piszesz w Pythonie za pomocą Sublime i otrzymujesz błędy wcięć,

zobacz -> wcięcia -> zamień wcięcia na spacje

Problem, który opisuję, jest spowodowany przez edytor tekstu Sublime. Ten sam problem może być spowodowany również przez innych redaktorów. Zasadniczo problem dotyczy tego, że Python chce traktować wcięcia w kategoriach spacji w porównaniu z różnymi edytorami kodującymi wcięcia w kategoriach tabulatorów.

Puneet Lamba
źródło
och ... więc czy to wzniosłe jest przyczyną tego?
nitin
Tak, problem, który opisuję, jest spowodowany przez Sublime. Może to być również spowodowane przez innych redaktorów. Zasadniczo problem dotyczy tego, że Python chce traktować wcięcia w kategoriach spacji w porównaniu z różnymi edytorami kodującymi wcięcia w kategoriach tabulatorów.
Puneet Lamba
Miałem ten sam problem z notatnikiem ++. To, co wydało się prawdą, zajęło trochę czasu, zanim to pękło. Musiałem przesuwać kursor po jednym znaku na raz, aby dowiedzieć się, że edytor przekonwertował kilka białych znaków na tabulatory
Bharat Anand,
4

Upewnij się, że w swoim edytorze używasz opcji „wstaw spacje zamiast tabulatorów”. Następnie możesz wybrać szerokość zakładki, na przykład 4. Możesz znaleźć te opcje w gedit w zakładce edit -> preferences -> editor.

konkluzja: UŻYWAJ SPACJI, a nie zakładek

Alex
źródło
Twój wynik finansowy załatwił sprawę!
Nick Div
3

Ten błąd może również wystąpić podczas wklejania czegoś do interpretera Pythona (terminal / konsola).

Zauważ, że interpreter interpretuje pusty wiersz jako koniec wyrażenia, więc jeśli wkleisz coś takiego jak

def my_function():
    x = 3

    y = 7

interpreter zinterpretuje pusty wiersz przed y = 7jako koniec wyrażenia, tj. że skończyłeś definiować swoją funkcję, a następna linia - y = 7będzie miała nieprawidłowe wcięcie, ponieważ jest to nowe wyrażenie.

Zoltán
źródło
kluczem jest to, że puste linie w definicji funkcji są w porządku, ale nadal muszą mieć początkowe białe znaki, ponieważ Python interpretuje każdą pustą linię jako koniec funkcji
MichaelChirico
3

Jedną z kwestii, o której nie wspomniano, jest to, że ten błąd może pojawić się z powodu problemu z kodem, który nie ma nic wspólnego z wcięciami.

Na przykład weźmy następujący skrypt:

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

Zwraca to, IndentationError: unexpected unindentgdy problemem jest oczywiście brakująca except:instrukcja.

Moja uwaga: sprawdź powyższy kod, w którym zgłoszono nieoczekiwane (nie) wcięcie!

WMoreland
źródło
2

Jeśli wcięcie wygląda dobrze, sprawdź, czy Twój edytor ma opcję „Wyświetl odstępy”. Włączenie tego powinno pozwolić na znalezienie miejsc, w których spacje i tabulatory są mieszane.


źródło
2

Jest sztuczka, która zawsze działała dla mnie:

Jeśli otrzymałeś nieoczekiwane wcięcie i zobaczysz, że cały kod jest idealnie wcięty, spróbuj otworzyć go innym edytorem, a zobaczysz, który wiersz kodu nie jest wcięty.

Zdarzyło mi się to, gdy używałem vim, gedit lub takich edytorów.

Spróbuj użyć tylko jednego edytora dla swojego kodu.

Jesus Rodriguez
źródło
2

Po prostu skopiuj skrypt i umieść pod "" "cały kod" "" ...

określ tę linię w zmiennej ... na przykład,

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..

teraz wykonaj ten kod w Sublime Editor używając ctrl + b, teraz wypisze wcięty kod w konsoli. Otóż ​​to

Mohideen bin Mohammed
źródło
jak uruchomię kod. Czy będę musiał usunąć "" "i" "" i wydrukować a.wymienić i uruchomić go normalnie?
chibole
żadne "" "" "" (potrójne cudzysłowy) nie odnoszą się do treści, a nie do ciągu. jest to wymagane, ponieważ Twój kod może zawierać ciąg znaków składający się z pojedynczych / podwójnych cudzysłowów, więc „” ”jest wymagany.
Mohideen bin Mohammed
2

Wszystko, co musisz zrobić, to usunąć spacje lub spacje z początku poniższych kodów

from django.contrib import admin

# Register your models here.
from .models import Myapp
admin.site.register(Myapp)
Sunil Tamang
źródło
2

Uruchom następujące polecenie, aby rozwiązać problem:

autopep8 -i <filename>.py

Spowoduje to zaktualizowanie kodu i rozwiązanie wszystkich błędów związanych z wcięciami :)

Mam nadzieję, że to rozwiąże

Sharyar Vohra
źródło
Bardzo łatwe do wdrożenia. Działa u mnie za każdym razem, dlatego mam nadzieję, że mam nadzieję, że będzie to dla kogoś korzystne :)
Sharyar Vohra
1

Notepad ++ dawał poprawne miejsce tabulacji, ale problem z wcięciami został ostatecznie znaleziony w edytorze tekstu Sublime.

Użyj edytora tekstu Sublime i przejdź linia po linii

HimalayanCoder
źródło
0

Wcięcie w Pythonie jest ważne i nie służy to po prostu czytelności kodu, w przeciwieństwie do wielu innych języków programowania. Jeśli w kodzie między kolejnymi poleceniami znajduje się biały znak lub tabulator, Python poda ten błąd, ponieważ Python jest na to wrażliwy. Prawdopodobnie wystąpi ten błąd, gdy kopiujemy i wklejamy kod do dowolnego Pythona. Upewnij się, że zidentyfikowałeś i usunąłeś te spacje za pomocą edytora tekstów, takiego jak Notepad ++, lub ręcznie usuń białe znaki z wiersza kodu, w którym pojawia się błąd.

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]]

Dzięki!

ashu Kr
źródło