IndentationError: unindent nie pasuje do żadnego zewnętrznego poziomu wcięcia


584

Gdy kompiluję poniższy kod Python, otrzymuję

IndentationError: unindent nie pasuje do żadnego zewnętrznego poziomu wcięcia


import sys

def Factorial(n): # Return factorial
    result = 1
    for i in range (1,n):
        result = result * i
    print "factorial is ",result
    return result

Dlaczego?


7
i prawdopodobnie zakres (1, n + 1) będzie lepszy, jeśli chcesz uwzględnić „n” w swoich obliczeniach :-)
Abgan

7
Miałem ten sam błąd, ale zdarzyło mi się wciąć metodę w górę kodu nieco w lewo, co dało ten błąd na dole następnej metody po nim. Tak więc ten błąd może wystąpić nie tylko z mieszania tabulatorów i spacji.
Umowa prof. Falkena została naruszona

14
Używam Sublime Text 3. Mam projekt Django. Naprawiłem błąd używającView > Indentation > Intent Using Spaces
AbhimanyuAryan

Gdyby ten problem występował w pycharmie, dostosowanie tabulatorów i odstępów w konfiguracjach nie działało. Problem polegał na tym, że miałem plik ~ / .editorconfig, który przesłaniał konfigurację pycharm.
Ken Myers

Odkryłem, że używanie IDLE znacznie ułatwia znajdowanie problemów z wcięciami. Wyraźnie znajdzie błędy wcięcia, których większość redaktorów nie znajdzie.
Dennis Gathagu

Odpowiedzi:


668

Inne plakaty prawdopodobnie są poprawne ... w twoich kartach mogą być pomieszane spacje. Spróbuj wyszukać i zamień, aby zastąpić wszystkie karty kilkoma spacjami.

Spróbuj tego:

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
tak, musiałem naprawdę spacja nad częścią wewnętrznej pętli na dwóch ostatnich liniach (tylko w SO). Nie jestem pewien, dlaczego ...
cbrulak

3
moja pierwsza linia „wynik = 0” (co powinno być ahve 1, dzięki za sprostowanie) zostało oddalone, a reszta została z zakładkami, cera, nie wiedział, pyton tak było
cbrulak

1
Tak, to może być trudne. Używam emacsa do edycji Pythona i mam konfigurację, aby zawsze zamieniać tabulatory spacjami w plikach py, więc nie mam tego problemu. Notepad ++ również może mieć taką opcję.
Kevin Tighe

3
Mam ten sam problem atm :). SublimeText pokazuje spacje jako kropki, co jest dość przydatne.
Kris,

Trzymaj się, możesz wciąć spacje LUB tabulatory. po prostu musisz być konsekwentny? wali głową
David

265

WAŻNE : spacje są preferowaną metodą - patrz PEP008 Wcięcia oraz tabulatory lub spacje? . (Dzięki za @Siha za to.)

Dla Sublime Textużytkowników:

Ustaw Sublime Textużywanie zakładek do wcięcia: View-> Indentation->Convert Indentation to Tabs

Odznacz Indent Using Spacesopcję również w tym samym podmenu powyżej. To natychmiast rozwiąże ten problem.


1
Również, gdy przy użyciu Python, upewnij się podobną opcję w zależności od tego IDE / edytora tekstu używasz ustawić
activatedgeek

20
Również w ATOM, Pakiety> Białe spacje> Konwertuj spacje na tabulatory, a unikniesz bólu głowy w składni Pythona!
loretoparisi

1
Spacje są preferowaną metodą - patrz PEP008 Wcięcia oraz Tabulatory lub Spacje? . Można również skonfigurować Sublime, aby zrobić to w ten sposób.
SiHa

13
mówisz, że spacje są preferowaną metodą, ale twoja odpowiedź prosi ludzi o wzniosłe użycie tabulatorów zamiast tego! Jestem zdezorientowany
gota

@NoCoim Cóż, niestety, stało się to po tym, jak odpowiedziałem na pytanie. Jeśli zaczynasz nowy projekt, użyj preferowanej techniki spacji. Dlatego dokonałem edycji pogrubioną czcionką, aby każdy nowy użytkownik wiedział o wyłączeniu odpowiedzialności.
activatedgeek

137

Aby łatwo sprawdzić problemy z tabulatorami / spacjami, możesz to zrobić:

python -m tabnanny yourfile.py

lub oczywiście możesz poprawnie skonfigurować edytor :-)


1
Próbowałem tego w pliku z pewnym błędem wcięcia tabulacji / spacji, ale nie wyświetlałem żadnych wyników z niepoprawnym plikiem tabulacji. dowolny pomysł?
Luchux,

1
Miałem problem ze spacjami i błąd powiedział, że to na linii 191, ale dzięki tabnanny odkryłem, że prawdziwy problem nie był na tej linii, ale na linii powyżej.
richar8086

Dziękuję Ci! Co za świetna wskazówka. Błąd został zidentyfikowany przez flake8 w kodzie VS, ale nie mógł zidentyfikować, gdzie był problem - tabnanny zrobił to w mikrosekundę.
Steve,

39

Czy na pewno nie mieszasz tabulatorów i spacji w białym wcięciu? (To spowoduje ten błąd.)

Uwaga: zaleca się, aby nie używać tabulatorów w kodzie Python. Zobacz przewodnik po stylu . Należy skonfigurować Notepad ++, aby wstawiał spacje dla tabulatorów.


Jestem zmieszany. Powyższa odpowiedź mówi o przełączeniu opcji edytora tekstu na używanie tabulatorów zamiast spacji.
spurra

3
@BananaCode Tak długo, jak używasz TYLKO tabulatorów lub TYLKO spacji, technicznie nie ma znaczenia, który wybierzesz. Chociaż dla Pythona spacje są preferowane, zobacz link, o którym mówiłem.
zdan

21

Ilekroć napotkałem ten błąd, dzieje się tak dlatego, że w jakiś sposób pomieszałem tabulatory i spacje w moim edytorze.


13

Jeśli korzystasz z edytora IDLE Pythona, możesz zrobić to, co sugeruje jeden z podobnych komunikatów o błędach:

1) wybierz wszystko, np. Ctrl+A

2) Przejdź do Format -> Untabify Region

3) Sprawdź dokładnie, czy wcięcie jest nadal poprawne, zapisz i uruchom ponownie program.

Używam Python 2.5.4


9

Jeśli używasz Vima, naciśnij klawisz Escape, a następnie wpisz

gg = G

To auto wcina wszystko i oczyści wszystkie miejsca, w które wrzuciłeś.


8

Linia: result = result * ipowinna być wcięta (jest to korpus pętli for).

Lub - masz mieszane znaki spacji i tabulacji


Musiałem zmienić edycję w SO, dziwne. Zobacz moją zaktualizowaną notatkę „Edytuj” w pytaniu
cbrulak

Ok, więc uważam, że drugi wiersz mojej odpowiedzi jest poprawny - masz mieszane znaki spacji i tabulacji (odpowiednio 32 i 8 w ASCII)
Abgan

5

Na Atom

iść do

Packages > Whitespace > Convert Spaces to Tabs

Następnie sprawdź ponownie wcięcie pliku:

python -m tabnanny yourFile.py

lub

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

4

Wygląda na problem z wcięciem. Nie trzeba dopasować nawiasów klamrowych w Pythonie, ale nie trzeba dopasować poziom wcięcia.

Najlepszym sposobem zapobiegania problemom ze spacją / tabulatorami jest wyświetlanie niewidocznych znaków w edytorze tekstu. Zapewni to szybki sposób zapobiegania błędom wcięcia i / lub ich rozwiązywania.

Również wstrzykiwanie wklejonego kodu jest częstym źródłem tego typu problemów.


4

Jeśli używasz notatnika ++, wykonaj „zamień” w trybie wyszukiwania rozszerzonego, aby znaleźć \ t i zamień na cztery spacje.


2

dla użytkowników Atomu Packages ->whitspace -> remove trailing whitespaces zadziałało to dla mnie


2

Tylko dodatek. Miałem podobny problem z dwoma wcięciami w Notepad ++.

  1. Nieoczekiwane wcięcie
  2. Poziom wcięcia zewnętrznego

    Idź do ----> zakładka Wyszukaj ----> dotknij zamień ----> kliknij przycisk radiowy Rozszerzony poniżej ---> Teraz zamień \ t czterema spacjami

    Idź do ----> zakładka Wyszukaj ----> dotknij zamień ----> kliknij przycisk opcji Rozszerzony poniżej ---> Teraz zamień \ n niczym


2

Korzystałem z notesu Jupyter i wypróbowałem prawie wszystkie powyższe rozwiązania (dostosowując się do mojego scenariusza), ale bezskutecznie. Następnie poszedłem linia po linii, usunąłem wszystkie spacje dla każdej linii i zastąpiłem tabulatorem. To rozwiązało problem.



1

Może być tak, ponieważ powyższa funkcja nie jest wcięta w ten sam sposób. to znaczy

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

1

Wczoraj miałem ten sam problem, był to błąd wcięcia, korzystałem z wysublimowanego edytora tekstu. godzinami próbowałem go naprawić, a na koniec skończyłem kopiowanie kodu do edytora tekstu VI i wszystko działało dobrze. Python ps jest zbyt wrażliwy na białe znaki, pamiętaj, aby nie mieszać spacji i tabulacji.


1

Ponieważ zdaję sobie sprawę, że nie ma konkretnej odpowiedzi spyder, dodam jedną: Zasadniczo uważnie przyjrzyj się swojemu ifoświadczeniu i upewnij się, że wszystkie if, elifi elsemają takie same odstępy, które są na początku w tej samej linii, tak:

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

Miałem zdefiniowaną funkcję, ale nie zawierała żadnych treści oprócz komentarzy do funkcji ...

def foo(bar):
    # Some awesome temporary comment.
    # But there is actually nothing in the function!
    # D'Oh!

Wrzasnął:

  File "foobar.py", line 69

                                ^
IndentationError: expected an indented block

(zwróć uwagę, że linia, na którą ^wskazuje znak, jest pusta)

-

Wiele rozwiązań:

1: Po prostu skomentuj funkcję

2: Dodaj komentarz funkcji

def foo(bar):
    '' Some awesome comment. This comment could be just one space.''

3: Dodaj wiersz, który nic nie robi

def foo(bar):
    0

W każdym razie upewnij się, że jest oczywiste, dlaczego jest to pusta funkcja - dla ciebie lub dla twoich rówieśników, którzy użyją twojego kodu


Instrukcja pass może być przydatna tam :)
KevinG

1

Po pierwsze, aby przypomnieć o logicznym błędzie, lepiej zachować wynik = 1, w przeciwnym razie wynik będzie wynosił 0, nawet po uruchomieniu pętli.

Po drugie, możesz to napisać w ten sposób:

import sys

def Factorial(n): # Return factorial
  result = 0
  for i in range (1,n):
     result = result * i

  print "factorial is ",result
  return result

Opuszczenie linii poinformuje powłokę pytona, że ​​instrukcje FOR zostały zakończone. Jeśli masz doświadczenie w używaniu powłoki Pythona, możesz zrozumieć, dlaczego musimy zostawić linię.


1

Na ile to jest warte, moje docstring zostało zbyt mocno wcięte, co również powoduje ten sam błąd

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

IndentationError: unindent does not match any outer indentation level


to naprawiło mój problem
bhordupur

0

Wynika to z pomieszania zarówno tabulatorów, jak i spacji. Możesz usunąć wszystkie spacje i zastąpić je tabulatorami.

Lub spróbuj napisać to:

#!/usr/bin/python -tt

na początku kodu. Ta linia rozwiązuje wszelkie różnice między tabulatorami i spacjami.



0

Jeśli używasz edytora Komodo, możesz zrobić to, co sugeruje jeden z podobnych komunikatów o błędach:

1) wybierz wszystko, np. Ctrl + A

2) Przejdź do Code -> Untabify Region

3) Sprawdź dokładnie, czy wcięcie jest nadal poprawne, zapisz i uruchom ponownie program.

Używam Python 3.4.2


0

Jeśli używasz Sublime text do programowania w języku Python, możesz uniknąć błędu, używając pakietu Anaconda. Po zainstalowaniu Anaconda,

  1. otwórz swój plik w wysublimowany sposób
  2. kliknij prawym przyciskiem myszy na puste przestrzenie
  3. wybierz anakondę
  4. kliknij na autoformatowanie
  5. GOTOWE Lub Naciśnij CTRL + ALT + R.

0

W programie Intellij z wtyczką python Ctrl + Shift + Alt, aby ponownie sformatować dokument, naprawiono problem wcięcia / tab / spacji


0

Dla użytkowników SPYDER : Używam Spyder 3.3.2 z Pythonem 3.7.1 i rozwiązałem ten problem, ustawiając wcięcie w celu użycia kart, wykonując następujące kroki, kliknij:

  • Przybory.
  • Preferencje.
  • Redaktor.
  • Zaawansowane ustawienia.
  • Znaki wcięcia -> Tabulatory.

Następnie resetuję wiersz „niezidentyfikowany” za pomocą klawisza Tab.

Z jakiegoś powodu, bez tego ustawienia czasami dostaję ducha IndentationError.


0

Na przykład:

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

W tym kodzie wystąpiła dla mnie taka sama sytuacja. Po prostu usuń poprzednie wcięcia linii 2 i 3, a następnie użyj tabulacji lub spacji. Nigdy nie używaj obu . Podaj poprawne wcięcie podczas pisania kodu w Pythonie. Dla Spyder goto Źródło> Napraw wcięcie. To samo dotyczy kodu VC i wysublimowanego tekstu lub dowolnego innego edytora. Napraw wcięcie.


-6

Dzieje się tak głównie z powodu edytora. Spróbuj zmienić tabulatory na spacje (4). Najlepszym przyjaznym dla Pythona IDE lub edytorami są pycharm, wysublimowany, vim dla Linuxa.
nawet ja również napotkałem ten sam problem, później odkryłem, że występuje problem z kodowaniem. Sugeruję, aby zmienić edytor.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.