„Niespójne użycie tabulatorów i spacji w wcięciach”


218

Próbuję utworzyć aplikację w języku Python 3.2 i cały czas używam tabulatorów do wcięcia, ale nawet edytor zmienia niektóre z nich na spacje, a następnie, gdy próbuję uruchomić, drukuje „niespójne użycie tabulatorów i spacji z wcięciem” program.

Jak mogę zmienić spacje na tabulatory? Doprowadza mnie to do szału. (Jestem początkującym w programowaniu). Byłbym szczęśliwy, gdybym mógł uzyskać ogólne wskazówki na temat mojego kodu, jeśli popełniłem wiele błędów, chętnie to usłyszę.

import random

attraktioner = ["frittfall","bergodalbana","spökhuset"]


class Nojesfalt:
    def __init__(self, attraktion):
        self.val = attraktion
        self.langd = 0
        self.alder = 0


#längdgräns för fritt fall
    def langdgrans(self):
        print("")
        self.langd = int(input("Hur lång är du i cm? "))
        if self.langd < 140:
            print("tyvärr, du är för kort, prova något annat")
            return 0
        elif self.langd >= 140:
            print("håll dig hatten, nu åker vi!")
            print(" ")
            return 1

#åldersgräns för spökhuset
    def aldersgrans(self):
        print("")
        self.alder = int(input("Hur gammal är du? "))
        if self.alder < 10:
            print("tyvärr, du är för ung, prova något annat")
            return 0
        elif self.alder >= 10:
            print("Gå in om du törs!")
            print(" ")
            return 1


#åker attraktion frittfall lr bergodalbana
        def aka(self):
                print("")
        print(self.val)
        tal = random.randint(0,100)
        if tal < 20:
            print("åkturen gick åt skogen, bättre lycka nästa gång")
        elif tal >= 20:
            print("jabbadabbbadoooooooo")
            return 1

#går i spökhuset
        def aka1(self):
                print("")
        print(self.val)
        tal = random.randint(0,100)
        if tal < 20:
            print("du är omringad av spöken och kan inte fortsätta")            return 0
        elif tal >= 20:
            print("Buhuuuuuu, buuuhuuuu")
            return 1

#programkod
print("Välkommen till nöjesfältet, vad vill du göra?")
print(" ")

while 1:
    vald_attr = input("Vad vill du göra?\n1. frittfall\n2. bergodalbana\n3. spökhuset\n4. Avsluta\n")
    if vald_attr == "1":
        val = Nojesfalt(attraktioner[0])
        if val.langdgrans() == 1:
            val.aka()
    elif vald_attr == "2":
        val = Nojesfalt(attraktioner[1])
        val.aka()
    elif vald_attr == "3":
        val = Nojesfalt(attraktioner[2])
        if val.aldersgrans() == 1:
            val.aka1()
    elif vald_attr == "4":
        break

25
Jest to problem z edytorem kodu, a nie z Pythonem. Powinieneś zmienić swoje pytanie, aby to odzwierciedlić i wspomnieć o używanym edytorze.
Jeff Mercado

3
Sposób zmiany zależy od edytora. Nie jestem pewien, czy jest to nawet temat na ten temat, może to być pytanie do superużytkownika.
Lennart Regebro

Zmień edytor, aby wyświetlał widoczne białe znaki na początku wiersza. Na przykład skonfigurowałem mój edytor, aby wyświetlał przezroczyste tabulatory i widoczne spacje, ponieważ używam tabulatorów do wcięcia kodu. Jeśli na początku linii widzę szum, wiem, że jest co najmniej jedna dodatkowa spacja. Jeśli nalegasz, aby robić to w niewłaściwy sposób, możesz skonfigurować edytor, aby ukrywał spacje i wyświetlał tabulatory. (Tak, wiem o PEP-8, ale się z tym nie zgadzam.)
Mikko Rantalainen

Odpowiedzi:


273

Nie używaj kart.

  1. Ustaw w edytorze użycie 4 spacji do wcięcia.
  2. Wyszukaj i zamień, aby zastąpić wszystkie tabulatory 4 spacjami.
  3. Upewnij się, że edytor jest ustawiony na wyświetlanie tabulatorów jako 8 spacji.

Uwaga: Powodem wprowadzenia 8 spacji dla tabulatorów jest natychmiastowe zauważenie, kiedy tabulatory zostały wstawione przypadkowo - na przykład podczas kopiowania i wklejania z przykładowego kodu, który używa tabulatorów zamiast spacji.


7
Czy jest jakieś uzasadnienie tych dogmatów?
RocketR

1
@Lennart Regebro, mam na myśli używanie spacji w ogóle. Używam ich, ale nieświadomie, zakładki wydają mi się lepsze. Nawiasem mówiąc, w programowaniu w Rubim każdy używa 2 spacji, więc nie jest to jedna reguła dla wszystkich.
RocketR

3
@RocketR: Odpowiedź dotyczy Pythona. Jeśli używasz tylko tabulatorów, otrzymujesz wcięcie 8-spacji, chyba że rozszerzysz tabulatory na coś innego niż 8 spacji, w takim przypadku będzie wyglądać źle w innych edytorach. Jeśli zmieszasz tabulatory i spacje, może się łamać (patrz pytanie) lub wyglądać na zepsute, jeśli masz tabulatory inne niż 8 spacji. Podsumowując: Używanie zakładek do wcięć jest niesamowicie złe. Nigdy tego nie rób (z wyjątkiem języków / formatów plików, które tego wymagają). Koniec.
Lennart Regebro

2
@RocketR Python ma Pep8, dokument, który wymienia „dobry styl python”, który wyraźnie stwierdza, że ​​4 spacje są akceptowaną formą wcięcia.
Daniel Gratzer

4
Link do odpowiedniej sekcji PEP 8 na temat spoilera „Tabulatory a spacje” : pierwszy wiersz to „Spacje są preferowaną metodą wcięcia”.
Tadhg McDonald-Jensen


43

Za pomocą edytora IDLE możesz użyć tego:

  • Edycja menu → Wybierz wszystko
  • Format menu → Untabify Region
  • Zakładając, że Twój edytor zastąpił 8 spacjami tabulatorem, wpisz 8 w polu wprowadzania.
  • Naciśnij Select, a to naprawi cały dokument.

15

Jeśli używasz Sublime Text do programowania w języku Python, możesz uniknąć błędu, używając pakietu Anaconda. Po zainstalowaniu Anacondy otwórz plik w Sublime Text, kliknij prawym przyciskiem myszy na puste przestrzenie → wybierz Anaconda → kliknij autoformatowanie. Sporządzono . Lub naciśnij Ctrl+ Alt+ R.


12

Ogólnie ludzie wolą wcięcia w przestrzeń. Jest bardziej spójny w różnych edytorach, co powoduje mniej niezgodności tego rodzaju. Można jednak wciąć klawiszem tab. To Twój wybór; należy jednak pamiętać, że standard 8 spacji na zakładkę jest nieco szeroki.

Jeśli chodzi o twój problem, najprawdopodobniej twój redaktor się pomylił. Aby przekonwertować tabulator na spację, naprawdę zależy od edytora.

Na przykład w Emacsie możesz wywołać metodę „untabify”.

W wierszu poleceń możesz użyć linii sed (dostosuj liczbę spacji do tego, co ci się podoba):

   sed -e 's;\t;       ;' < yourFile.py > yourNedFile.py

9

Podczas korzystania z wysublimowanego edytora tekstu byłem w stanie wybrać segment mojego kodu, który dał mi inconsistent use of tabs and spaces in indentationbłąd i wybrać:

view > indentation > convert indentation to spaces

co rozwiązało problem dla mnie.


8

Co zrobiłem, gdy pojawił się ten sam błąd: Wybierz wszystko ( Str+ A) i naciśnij Shift+ Tab. Nic już nie było wcięte. Teraz wróć do linii, które chcesz wciąć, i umieść to z powrotem tak, jak chcesz.

To działało dla mnie ...


7

Niedawno miałem ten sam problem i dowiedziałem się, że po prostu muszę przekonwertować zestaw znaków pliku .py na UTF-8 zestaw ponieważ jest to zestaw, którego używa Python 3.

BTW, cały czas używałem 4-spacji, więc problem nie był przez nich spowodowany.


6

Podniosły tekst 3

W Sublime Text, PODCZAS edycji do Pythona pliku:

Menu Podniosły tekst > Preferencje > Ustawienia - Specyficzne dla składni :

Ustawienia Python.sublime

{
    "tab_size": 4,
    "translate_tabs_to_spaces": true
}

5

Można rozwiązać ten problem notepad++, zastępując Tabs 4 Spaces:

  1. Wybierz Szukaj -> Znajdź ... lub naciśnij Ctrl+F
  2. Wybierz Zamień zakładkę
  3. W polu o nazwie Tryb wyszukiwania wybierz Rozszerzony (\ n, \ r, \ t, \ 0, \ x ...)
  4. W polu Znajdź co: napisz \ t
  5. W polu Zamień na: naciśnijSpace 4 razy. Upewnij się, że w tej dziedzinie nie ma nic więcej.
  6. Kliknij przycisk Zamień wszystko

Jak zastąpić tabulatory spacjami


3

Miałem ten problem. Rozwiązanie: „tab” przed wierszem problemu to spacje, 4, 6 lub 8 spacji. Powinieneś je usunąć i wstawić TAB. „\ t”. To wszystko.


Nie zaleca się używania znaków TAB podczas kodowania w Pythonie - czytaj PEP008 ( python.org/dev/peps/pep-0008 )
Tony Suffolk 66

2

Używam Notepad ++ i dostałem ten błąd.

W Notepad ++ zobaczysz, że zarówno tab, jak i cztery spacje są takie same, ale kiedy skopiujesz swój kod do Python IDLE , zobaczysz różnicę, a linia z tabulacją będzie miała przed sobą więcej miejsca niż inne.

Aby rozwiązać problem, po prostu usunąłem tabulator przed linią, a następnie dodałem cztery spacje.


2

Miałem ten sam błąd. Musiałem dodać kilka linii kodu do istniejącego pliku * .py. W Notepad ++ to nie działało.

Po dodaniu wierszy kodu i zapisaniu otrzymałem ten sam błąd. Kiedy otworzyłem ten sam plik w PyCharm i dodałem linie, błąd zniknął.


1

Dostałem te same błędy, ale nie mogłem zrozumieć, co robiłem źle.

Naprawiłem to, uruchamiając automatyczne wcięcie w moim kodzie i pozwalając maszynie naprawić mój błąd.

Jeśli ktoś zastanawia się, jak to zrobiłem. Prosty. Idź w vim. Wpisz G = gg.

To automatycznie wszystko naprawi. Powodzenia :)


1

Twój problem wynika z ograniczeń / konfiguracji edytora. Niektóre edytory zapewniają narzędzia pomocne w rozwiązaniu problemu poprzez:

  1. Konwersja tabulatorów na spacje

    Na przykład, jeśli używasz edytora Pythona Stani, możesz go skonfigurować tak, aby robił to przy zapisywaniu.

  2. Przekształcanie spacji w tabulatory

Jeśli używasz ActiveState Komodo, masz narzędzie do „tabify” kodu. Jak już zauważyli inni, nie jest to dobry pomysł.

Pydev w Eclipse udostępnia funkcje „Konwertuj tabulatory na spacje” i „Konwertuj spacje na tabulatory”.


1

Jeśli Twój edytor nie rozpoznaje tabulatorów podczas wyszukiwania i zamiany (jak SciTE), możesz wkleić kod do Worda i wyszukać za pomocą Ctr-H i ^ t, który znajdzie tabulatory, które następnie można zastąpić 4 spacjami.


1

Odtąd było duplikat tego pytania , ale pomyślałem, że zaoferuję pogląd na nowoczesne edytory i szeroki wachlarz funkcji, które oferują. W przypadku kodu Pythona wszystko, co musi być zamierzone w .pypliku, musi być intentowane za pomocą klawisza Tab lub spacji. Konwencja ma używać czterech spacji do wcięcia. Większość edytorów ma możliwość wizualnego pokazania w edytorze, czy kod jest wcięty spacjami czy tabulatorami, co znacznie pomaga w debugowaniu. Na przykład z atomem, przechodząc do preferencji, a następnie edytora, możesz zobaczyć dwie następujące opcje:

edytor atomów do wyświetlania tabulatorów i spacji

Następnie, jeśli kod używa spacji, zobaczysz małe kropki w miejscu wcięcia kodu:

wprowadź opis zdjęcia tutaj

A jeśli jest wcięty za pomocą tabulatorów, zobaczysz coś takiego:

wprowadź opis zdjęcia tutaj

Teraz, jeśli zauważyłeś, możesz zauważyć, że podczas korzystania z tabulatorów po lewej stronie jest więcej błędów / ostrzeżeń, jest to spowodowane czymś, co nazywa się dokumentacją pep8 pep8 , która jest w zasadzie jednolitym przewodnikiem po stylu dla Pythona, dzięki czemu wszyscy programiści głównie kodują ten sam standard i wygląd, który pomaga przy próbie zrozumienia kodu innych ludzi, to w pep8 preferuje użycie spacji zamiast wcięć zamiast tabulatorów. Widzimy też, jak edytor pokazuje ostrzeżenie związane z kodem ostrzegawczym pep8 W191,

Mam nadzieję, że wszystko powyższe pomoże ci zrozumieć naturę problemu, który masz i jak temu zapobiec w przyszłości.


0

Czasami tabpsuje się podczas wcięcia. Jednym ze sposobów jest oczywiście użycie tabi backspacepoprawne wcięcie kodu.

Innym sposobem jest użycie space 4 razy (w zależności od tego, ile chcesz wcięcia).

Dziwny sposób, który działał dla mnie, gdy nic innego nie działało, bez względu na linię, w której pojawia się błąd, przesuwałem backspacedtę linię do poprzedniej linii, a następnie nacisnąłem enter. Automatycznie wcięło linię do prawidłowej pozycji i po tym nie otrzymałem żadnego błędu.

Mam nadzieję, że to powinno pomóc.


0

Miałem ten sam problem i naprawiłem go za pomocą następującego skryptu Python. mam nadzieję, że pomoże innym.

wynika to z używania tabulatorów i spacji do wcięcia kodu. w tym skrypcie zastępuję każdą kartę czterema spacjami.

input_file = "source code path here"  # e.g. source.py
output_file = "out put file path here"  # e.g out.py
with open(input_file, 'r') as source:
    with open(output_file, 'a+') as result:
        for line in source:
            line = line.replace('\t', '    ')
            result.write(line)

jeśli używasz wzniosłego lub innego edytora, który daje ci narzędzie do zamiany tekstu, możesz zastąpić wszystkie tabulatory czterema spacjami w edytorze.


0

Użyj, Idle dla python lub Idle3 dla python3.


2
Przydałoby się trochę wyjaśnienia, w jaki sposób / dlaczego to zadziałało.
Taslim Oseni

Problem wynika z tabulacji zamiast spacji w regionie. Bezczynność może cofnąć weryfikację całego regionu i rozwiązać problem (wystarczy wybrać opcję Untabify z menu Format).
simc

0

Rozwiązanie tego za pomocą edytora Vima

  1. Otwórz terminal ( Ctrl+ Alt+ T).
  2. Przejdź do katalogu, w którym znajduje się plik ( cd <path_to_your_directory>). Np cd /home/vineeshvs/work. :
  3. Otwórz plik w Vimie ( vim <file_name>). Np vim myfile.txt. :
  4. [Krok opcjonalny] Włącz podświetlanie słów kluczowych wyszukiwania w Vimie ( ESC :set hlsearch)
  5. Przejdź do wiersza, w którym masz ten problem ( ESC :<line_number>). Np .: :53w edytorze Vima po jednokrotnym naciśnięciu ESCprzycisku.
  6. Zamień tabulatory, używając wymaganej liczby spacji w Vim ( :.,$s/\t/<give_as_many_spaces_as_you_want_to_replace_tab>/gc). Np .: Tab zostanie zastąpiony czterema spacjami przy użyciu następującego polecenia: :.,$s/\t/ /gcpo jednokrotnym naciśnięciu ESC przycisku). Ten proces jest interaktywny. Możesz yzamienić kartę na spację i npominąć konkretną zamianę. Naciśnij ESCpo zakończeniu wymaganych wymian.

0

Dziwnie napotkałem podobny problem z jednym z moich plików .py. Po prostu otworzyłem plik w Pycharmie i nacisnąłem Option+ Command+, Lktóry poprawnie formatuje zawartość pliku za jednym razem.

Podejrzewam, że miałem kłopoty, ponieważ kodowałem ten konkretny plik .py w laboratoriach jupyter, w przeciwieństwie do mojego zwykłego wyboru wysublimowanego tekstu lub Pycharm, i dlatego napotkałem pewne ukryte problemy z wcięciami, w których wiele odpowiedzi odnosiło się tutaj


0

Cóż, miałem ten sam problem i zdałem sobie sprawę, że problem polega na tym, że skopiowałem kod z innego edytora Pythona do sublime.

Pracowałem z notatnikiem jupyter, a następnie skopiowałem kod do wzniosłego. Najwyraźniej po dokonaniu określonych modyfikacji (takich jak przenoszenie kodu w funkcjach) wcięcie staje się nieuporządkowane i stąd pochodzi problem.

Więc po prostu trzymaj się jednego edytora. Jeśli to zrobisz, nie będziesz mieć problemu.


0

Skorzystaj z pylintniego, a otrzymasz szczegółowy raport o tym, ile miejsca potrzebujesz i gdzie.


0

Jeśli używasz ATOM:

Idź do Menu: Pakiety -> WhiteSpace -> Konwertuj wszystkie karty na spacje


0

Spróbuj usunąć wcięcia, a następnie systematycznie naciskając klawisz Tab lub naciskając klawisz 4 razy. Zwykle dzieje się tak, gdy mam wcięcie za pomocą klawisza tab, a następnie klawisz spacji w następnym wierszu.


-2

Zaznacz wcięte bity, a następnie kliknij karty. Będą wtedy spójne :)


2
Jest to sprzeczne z PEP 8 , kanonicznym przewodnikiem po języku Python, który zaleca 4 spacje. Doradzanie osobom korzystającym z kart jest bardziej niespójne.
Aurora0001,

nie wspominając o tym, że jeśli współpracownicy tego kodu używający PEP8 napotkają ten sam błąd
Thomas Matthew
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.