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?

Cbrulak
źródło
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)
Kevin Tighe
źródło
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.

aktywowany
źródło
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 :-)

André
źródło
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.

zdan
źródło
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.

Dana
źródło
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

Gatica
źródło
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ś.

cbartondock
źródło
8

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

Lub - masz mieszane znaki spacji i tabulacji

Abgan
źródło
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")
loretoparisi
źródło
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.

Matt Kahl
źródło
4

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

Jackie Lee
źródło
2

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

Aha
źródło
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

JumpMan
źródło
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.

Cur123
źródło
2

Dla użytkowników Spyder źródło> Napraw wcięcie, aby natychmiast naprawić problem

Hafiz Abdulbasith
źródło
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")
Ali
źródło
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.

użytkownik3731311
źródło
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!")
NelsonGon
źródło
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

Cedric
źródło
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ę.

Faisal Ahmed Farooq
źródło
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

plfrick
źródło
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.

Eragon
źródło
0

w moim przypadku problemem była konfiguracja pydev na Eclipse

pydev @ Eclipse

Rui Martins
źródło
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

Imtiaz Pabel
źródło
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.
Kapilfreeman
źródło
0

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

Rene Ferguson
źródło
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.

Mikrofon
źródło
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.

Ayush Aryan
źródło
-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.

yunus
źródło