„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
Julia Lärkert
źródło
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.

Lennart Regebro
źródło
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
62

Użycie autopep8poniższego polecenia naprawiło to dla mnie:

 autopep8 -i my_file.py

Dokumentacja do autopep8 linku tutaj.

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

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

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

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

Vlad
źródło
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
}
chebaby
źródło
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

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

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

użytkownik3625605
źródło
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ął.

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

Shaurya Kapoor
źródło
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”.

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

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

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

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

Farbod Shahinfar
źródło
0

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

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

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

Letsios Manthos
źródło
0

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

Aymen Alsaadi
źródło
0

Jeśli używasz ATOM:

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

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

Fateh
źródło
-2

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

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