"Inkonsistente Verwendung von Tabulatoren und Leerzeichen in Einrückungen"

218

Ich versuche, eine Anwendung in Python 3.2 zu erstellen, und verwende ständig Tabulatoren zum Einrücken, aber selbst der Editor ändert einige davon in Leerzeichen und druckt dann "inkonsistente Verwendung von Tabulatoren und Leerzeichen in Einrückungen" aus, wenn ich versuche, sie auszuführen das Programm.

Wie kann ich die Leerzeichen in Tabulatoren ändern? Es macht mich verrückt. (Ich bin ein Anfänger in der Programmierung). Ich würde mich freuen, wenn ich einige allgemeine Tipps zu meinem Code bekommen könnte, wenn ich viele Fehler gemacht hätte, würde ich mich freuen zu hören.

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
quelle
25
Das ist ein Problem mit Ihrem Code-Editor, nicht wirklich mit Python. Sie sollten Ihre Frage ändern, um dies widerzuspiegeln, und angeben, welchen Editor Sie verwenden.
Jeff Mercado
3
Wie Sie dies ändern, hängt von Ihrem Editor ab. Ich bin mir nicht sicher, ob dies hier überhaupt ein Thema ist, es könnte eine Frage für den Superuser sein.
Lennart Regebro
Ändern Sie Ihren Editor so, dass am Anfang der Zeile sichtbare Leerzeichen angezeigt werden. Zum Beispiel habe ich meinen Editor so konfiguriert, dass transparente Tabulatoren und sichtbare Bereiche angezeigt werden, da ich Tabulatoren zum Einrücken von Code verwende. Wenn ich am Anfang der Zeile ein Geräusch sehe, weiß ich, dass es ein oder mehrere zusätzliche Leerzeichen gibt. Wenn Sie darauf bestehen, es falsch zu machen, können Sie Ihren Editor so konfigurieren, dass Leerzeichen ausgeblendet und Tabulatoren angezeigt werden. (Ja, ich weiß über PEP-8 Bescheid, aber ich stimme dem nicht zu.)
Mikko Rantalainen

Antworten:

273

Verwenden Sie keine Registerkarten.

  1. Stellen Sie Ihren Editor so ein, dass 4 Leerzeichen zum Einrücken verwendet werden.
  2. Führen Sie eine Suche durch und ersetzen Sie sie, um alle Registerkarten durch 4 Leerzeichen zu ersetzen.
  3. Stellen Sie sicher, dass in Ihrem Editor Registerkarten als 8 Leerzeichen angezeigt werden.

Hinweis: Der Grund für 8 Leerzeichen für Tabulatoren ist, dass Sie sofort bemerken, wenn Tabulatoren unbeabsichtigt eingefügt wurden - beispielsweise beim Kopieren und Einfügen aus Beispielcode, der Tabulatoren anstelle von Leerzeichen verwendet.

Lennart Regebro
quelle
7
Gibt es Gründe für diese Dogmen?
RocketR
1
@ Lennart Regebro, ich meine, überhaupt Leerzeichen zu verwenden. Ich benutze sie, aber unbewusst scheinen mir Tabs besser zu sein. Übrigens verwendet in der Ruby-Programmierung jeder zwei Leerzeichen, es ist also keine einzige Regel für alle.
RocketR
3
@RocketR: Die Antwort ist für Python. Wenn Sie nur Tabulatoren verwenden, erhalten Sie einen Einzug mit 8 Leerzeichen, es sei denn, Sie erweitern Tabulatoren auf etwas anderes als 8 Leerzeichen. In diesem Fall sieht es in anderen Editoren schlecht aus. Wenn Sie Tabulatoren und Leerzeichen mischen, kann dies zu einer Unterbrechung (siehe Frage) oder zu einer fehlerhaften Darstellung führen, wenn die Tabulatoren nicht um 8 Leerzeichen erweitert werden. Zusammenfassend: Die Verwendung von Registerkarten zum Einrücken ist unglaublich schlecht. Tun Sie das niemals (außer für Sprachen / Dateiformate, die dies erfordern). Das Ende.
Lennart Regebro
2
@RocketR Python hat Pep8, ein Dokument, das den "guten Python-Stil" auflistet, in dem ausdrücklich angegeben ist, dass 4 Leerzeichen beim Einrücken die akzeptierte Form sind.
Daniel Gratzer
4
Link zum relevanten PEP 8-Abschnitt zum Spoiler "Tabs vs Spaces" : Die erste Zeile lautet "Spaces sind die bevorzugte Einrückungsmethode".
Tadhg McDonald-Jensen
62

Mit dem folgenden autopep8Befehl wurde das Problem für mich behoben:

 autopep8 -i my_file.py

Dokumentation für autopep8 hier verlinkt.

Akavall
quelle
43

Mit dem IDLE- Editor können Sie Folgendes verwenden:

  • Menü BearbeitenAlle auswählen
  • Menü Formatuntabify sehr Region
  • Angenommen, Ihr Editor hat 8 Leerzeichen durch eine Registerkarte ersetzt, geben Sie 8 in das Eingabefeld ein.
  • Klicken Sie auf Auswählen, um das gesamte Dokument zu reparieren.
arsb48
quelle
15

Wenn Sie Sublime Text für die Python-Entwicklung verwenden, können Sie den Fehler mithilfe des Pakets Anaconda vermeiden. Öffnen Sie nach der Installation von Anaconda Ihre Datei in Sublime Text, klicken Sie mit der rechten Maustaste auf die offenen Stellen → wählen Sie Anaconda → klicken Sie auf Autoformat. Fertig . Oder drücken Sie Ctrl+ Alt+ R.

Kapilfreeman
quelle
12

Im Allgemeinen bevorzugen die Leute das Einrücken mit dem Raum. Es ist für alle Editoren konsistenter, was zu weniger Fehlanpassungen dieser Art führt. Sie dürfen jedoch mit Tab einrücken. Es ist deine Wahl; Beachten Sie jedoch, dass der Standard von 8 Leerzeichen pro Registerkarte etwas breit ist.

In Bezug auf Ihr Problem hat Ihr Redakteur höchstwahrscheinlich Probleme. Das Konvertieren von Registerkarten in Leerzeichen ist wirklich vom Editor abhängig.

Unter Emacs können Sie beispielsweise die Methode 'untabify' aufrufen.

In der Befehlszeile können Sie eine sed-Zeile verwenden (passen Sie die Anzahl der Leerzeichen an, was Ihnen gefällt):

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

Bei Verwendung des erhabenen Texteditors konnte ich das Segment meines Codes auswählen, das mir den inconsistent use of tabs and spaces in indentationFehler gab, und Folgendes auswählen:

view > indentation > convert indentation to spaces

das löste das Problem für mich.

Dulangi_Kanchana
quelle
8

Was ich getan habe, als der gleiche Fehler auftauchte: Wählen Sie alles ( Str+ A) und drücken Sie Shift+Tab . Es wurde also nichts mehr eingerückt. Kehren Sie nun zu den Zeilen zurück, die Sie eingerückt haben möchten, und setzen Sie sie wieder so ein, wie Sie es möchten.

Es hat bei mir funktioniert ...

hccavs19
quelle
7

Ich hatte kürzlich das gleiche Problem und fand heraus, dass ich nur den Zeichensatz der .py-Datei in UTF-8 konvertieren musste , da dies der Satz ist, den Python 3 verwendet.

Übrigens habe ich die ganze Zeit Tabulatoren mit 4 Leerzeichen verwendet, damit das Problem nicht durch sie verursacht wurde.

Vlad
quelle
6

Erhabener Text 3

In Sublime Text, WÄHREND Sie eine Python- Datei bearbeiten :

Sublime Text-Menü > Einstellungen > Einstellungen - Syntaxspezifisch :

Python.sublime-Einstellungen

{
    "tab_size": 4,
    "translate_tabs_to_spaces": true
}
Chebaby
quelle
5

Es ist möglich, dieses Problem zu lösen, notepad++indem Sie Tabs durch 4 Spaces ersetzen :

  1. Wählen Sie Suchen -> Suchen ... oder drücken Sie Ctrl+F
  2. Wählen Sie die Registerkarte Ersetzen
  3. In der Box namens Suchmodus wählen Extended (\ n \ r \ t, \ 0, \ x ...)
  4. Im Feld Finden Sie was: Schreiben Sie \ t
  5. Im Feld Ersetzen durch:Space 4 Mal drücken . Stellen Sie sicher, dass sich in diesem Bereich nichts anderes befindet.
  6. Klicken Sie auf die Schaltfläche Alle ersetzen

So ersetzen Sie Tabulatoren durch Leerzeichen

Zarek
quelle
3

Ich hatte dieses Problem. Lösung: Ihre Registerkarte vor der Problemzeile besteht aus Leerzeichen, 4, 6 oder 8 Leerzeichen. Sie sollten sie löschen und TAB einfügen. '\ t'. Das ist alles.

Gaorin
quelle
Es wird nicht empfohlen, beim Codieren mit Python TAB-Zeichen zu verwenden - lesen Sie PEP008 ( python.org/dev/peps/pep-0008 )
Tony Suffolk 66
2

Ich benutze Notepad ++ und habe diesen Fehler bekommen.

In Notepad ++ werden Sie sehen, dass sowohl die Registerkarte als auch die vier Leerzeichen identisch sind, aber wenn Sie Ihren Code in Python IDLE kopieren Sie den Unterschied, und die Zeile mit einer Registerkarte enthält mehr Leerzeichen als die anderen.

Um das Problem zu lösen, habe ich einfach die Registerkarte vor der Zeile gelöscht und dann vier Leerzeichen hinzugefügt.

user3625605
quelle
2

Ich hatte den gleichen Fehler. Ich musste einer vorhandenen * .py-Datei mehrere Codezeilen hinzufügen. In Notepad ++ hat es nicht funktioniert.

Nach dem Hinzufügen der Codezeilen und dem Speichern wurde der gleiche Fehler angezeigt. Als ich dieselbe Datei in PyCharm öffnete und die Zeilen hinzufügte, verschwand der Fehler.

Andrushenko Alexander
quelle
1

Ich habe die gleichen Fehler erhalten, konnte aber nicht herausfinden, was ich falsch gemacht habe.

Also habe ich es behoben, indem ich meinen Code automatisch eingerückt habe und dem Computer erlaubt habe, meinen Fehler zu beheben.

Wenn sich jemand fragt, wie ich das gemacht habe. Einfach. Geh in vim. Geben Sie G = gg ein.

Dadurch wird automatisch alles behoben. Viel Glück :)

Shaurya Kapoor
quelle
1

Ihr Problem ist auf die Einschränkungen / Konfiguration Ihres Editors zurückzuführen. Einige Editoren stellen Ihnen Tools zur Verfügung, mit denen Sie das Problem lösen können, indem Sie:

  1. Tabulatoren in Leerzeichen konvertieren

    Wenn Sie beispielsweise den Python-Editor von Stani verwenden, können Sie ihn so konfigurieren, dass er beim Speichern ausgeführt wird.

  2. Leerzeichen in Tabulatoren konvertieren

Wenn Sie ActiveState Komodo verwenden, verfügen Sie über ein Tool zum Tabellieren Ihres Codes. Wie andere bereits betont haben, ist dies keine gute Idee.

Pyclv von Eclipse bietet die Funktionen "Tabulatoren in Leerzeichen konvertieren" und "Leerzeichen in Registerkarten konvertieren".

Joaquin
quelle
1

Wenn Ihr Editor beim Suchen und Ersetzen keine Registerkarten erkennt (wie SciTE), können Sie den Code in Word einfügen und mit Strg-H und ^ t suchen, um die Registerkarten zu finden, die dann durch 4 Leerzeichen ersetzt werden können.

kozowh
quelle
1

Von hier aus gab es ein Duplikat dieser Frage , aber ich dachte, ich würde einen Blick auf moderne Editoren und die Vielzahl der von ihnen angebotenen Funktionen werfen. Mit Python-Code muss alles, was in einer .pyDatei beabsichtigt sein soll , entweder alle mit der Tabulatortaste oder durch Leerzeichen beabsichtigt sein. Konvention ist, vier Leerzeichen für eine Einrückung zu verwenden. Die meisten Editoren können im Editor visuell anzeigen, ob der Code mit Leerzeichen oder Tabulatoren eingerückt wird, was beim Debuggen sehr hilfreich ist. Wenn Sie beispielsweise mit atom zu Einstellungen und dann zum Editor gehen, sehen Sie die folgenden zwei Optionen:

Atom-Editor zum Anzeigen von Tabulatoren und Leerzeichen

Wenn Ihr Code Leerzeichen verwendet, sehen Sie kleine Punkte, an denen Ihr Code eingerückt ist:

Geben Sie hier die Bildbeschreibung ein

Und wenn es mit Tabulatoren eingerückt wird, sehen Sie ungefähr Folgendes:

Geben Sie hier die Bildbeschreibung ein

Wenn Sie jetzt bemerkt haben, können Sie sehen, dass bei der Verwendung von Registerkarten links mehr Fehler / Warnungen angezeigt werden. Dies liegt an der sogenannten pep8 pep8-Dokumentation , die im Grunde eine einheitliche Stilrichtlinie für Python ist, sodass alle Entwickler meistens Code für verwenden Der gleiche Standard und das gleiche Erscheinungsbild, die beim Versuch helfen, den Code anderer zu verstehen, sind in pep8 enthalten, bei dem Leerzeichen anstelle von Tabulatoren zum Einrücken bevorzugt werden. Und wir können sehen, dass der Editor zeigt, dass es eine Warnung bezüglich des pep8-Warncodes gibtW191 gibt.

Ich hoffe, all das hilft Ihnen dabei, die Art des Problems zu verstehen, das Sie haben, und wie Sie es in Zukunft verhindern können.

jupiar
quelle
0

Manchmal wird tabbeim Einrücken etwas durcheinander gebracht. Eine Möglichkeit besteht darin, den Code offensichtlich zu verwenden tabund backspaceden Code korrekt einzurücken.

Eine andere Möglichkeit besteht darin, space viermal zu verwenden (je nachdem, wie viel Sie einrücken möchten).

Eine seltsame Art und Weise, die für mich funktioniert hat, wenn nichts anderes funktioniert hat, egal in welcher Zeile ich den Fehler erhalte, ich habe backspaceddiese Zeile in die vorherige Zeile verschoben und dann gedrückt enter. Die Linie wurde automatisch in die richtige Position eingerückt, und danach wurde kein Fehler mehr angezeigt.

Hoffentlich sollte dies helfen.

Sarvagya Gupta
quelle
0

Ich hatte das gleiche Problem und behebte es mit dem folgenden Python-Skript. hoffe es hilft anderen.

Dies liegt an der Verwendung von Tabulatoren und Leerzeichen zum Einrücken von Code. In diesem Skript ersetze ich jede Registerkarte durch vier Leerzeichen.

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)

Wenn Sie sublime oder einen anderen Editor verwenden, mit dem Sie Text ersetzen können, können Sie alle Registerkarten im Editor durch vier Leerzeichen ersetzen.

Farbod Shahinfar
quelle
0

Verwenden Sie Idle für Python oder Idle3 für Python3.

simc
quelle
2
Eine kleine Erläuterung, wie / warum dies für Sie funktioniert hat, wäre hilfreich gewesen.
Taslim Oseni
Das Problem liegt an Tabulatoren anstelle von Leerzeichen in der Region. Leerlauf kann die gesamte Region aufheben und das Problem beheben (wählen Sie einfach Aufheben im Menüformat).
Simc
0

Lösen Sie dies mit dem Vim-Editor

  1. Terminal öffnen ( Ctrl+ Alt+ T).
  2. Wechseln Sie in das Verzeichnis, in dem sich die Datei befindet ( cd <path_to_your_directory>). Bsp. : cd /home/vineeshvs/work.
  3. Öffnen Sie die Datei in Vim ( vim <file_name>). Bsp. : vim myfile.txt.
  4. [Optionaler Schritt] Aktivieren Sie die Hervorhebung von Suchbegriffen in Vim ( ESC :set hlsearch)
  5. Gehen Sie zu der Zeile, in der Sie dieses Problem haben ( ESC :<line_number>). Beispiel: :53im Vim-Editor nach ESCeinmaligem Drücken der Taste.
  6. Ersetzen Sie die Registerkarten durch die erforderliche Anzahl von Leerzeichen in Vim ( :.,$s/\t/<give_as_many_spaces_as_you_want_to_replace_tab>/gc). Beispiel: Die Registerkarte wird mit dem folgenden Befehl durch vier Leerzeichen ersetzt: :.,$s/\t/ /gcnach ESC einmaligem Drücken der Taste). Dieser Prozess ist interaktiv. Sie können angeben y, dass die Registerkarte durch Leerzeichen ersetzt und nein bestimmter Ersatz übersprungen werden soll. Drücken ESCSie, wenn Sie mit den erforderlichen Ersetzungen fertig sind.
Vineeshvs
quelle
0

Ich bin seltsamerweise auf ein ähnliches Problem mit einer meiner .py-Dateien gestoßen. Ich habe die Datei einfach in Pycharm geöffnet und Option+ Command+ gedrückt, Lwodurch der Dateiinhalt auf einmal korrekt formatiert wird.

Ich vermute, ich hatte Probleme, weil ich diese spezielle .py-Datei im Gegensatz zu meiner üblichen Auswahl an erhabenem Text oder Pycharm über Jupyter Labs codiert habe und daher auf einige versteckte Einrückungsprobleme gestoßen bin, auf die viele Antworten hier angespielt haben

DrDEE
quelle
0

Nun, ich hatte das gleiche Problem und mir wurde klar, dass das Problem darin besteht, dass ich Code von einem anderen Python-Editor nach sublime kopiert habe.

Ich habe mit Jupyter Notebook gearbeitet und dann den Code in sublime kopiert. Wenn Sie bestimmte Änderungen vornehmen (z. B. das Verschieben von Code in Funktionen), wird der Einzug anscheinend unübersichtlich, und hier liegt das Problem.

Halten Sie sich also einfach an einen Editor. Wenn Sie dies tun, haben Sie kein Problem.

Letsios Manthos
quelle
0

Wenn pylintSie es verwenden, erhalten Sie einen detaillierten Bericht darüber, wie viele Speicherplätze Sie benötigen und wo.

Aymen Alsaadi
quelle
0

Wenn Sie ATOM verwenden:

Gehen Sie zu Menü: Pakete -> WhiteSpace -> Alle Registerkarten in Leerzeichen konvertieren

Daniel Moraite
quelle
0

Versuchen Sie, die Einrückungen zu löschen, und drücken Sie dann systematisch entweder viermal die Tabulatortaste oder die Leertaste. Dies passiert mir normalerweise, wenn ich einen Einzug mit der Tabulatortaste habe und dann die Leertaste in der nächsten Zeile verwende.

Fateh
quelle
-2

Markieren Sie die eingerückten Bits und klicken Sie dann auf die Registerkarten. Sie werden dann konsistent :)

Anonym
quelle
2
Dies steht im Widerspruch zu PEP 8 , dem kanonischen Python-Styleguide, der 4 Leerzeichen empfiehlt. Die Empfehlung, Tabulatoren zu verwenden, ist inkonsistenter.
Aurora0001
Ganz zu schweigen davon, dass bei Mitarbeitern dieses Codes, die PEP8 verwenden, derselbe Fehler auftritt
Thomas Matthew