Jak naprawić błąd „nieoczekiwane wcięcie” w Pythonie?
Jak naprawić błąd „nieoczekiwane wcięcie” w Pythonie?
Odpowiedzi:
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.
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
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.
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.
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
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 = 7
jako koniec wyrażenia, tj. że skończyłeś definiować swoją funkcję, a następna linia - y = 7
będzie miała nieprawidłowe wcięcie, ponieważ jest to nowe wyrażenie.
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 unindent
gdy problemem jest oczywiście brakująca except:
instrukcja.
Moja uwaga: sprawdź powyższy kod, w którym zgłoszono nieoczekiwane (nie) wcięcie!
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.
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.
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
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)
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
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
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!