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