web-dev-qa-db-de.com

Tabs versus Leerzeichen bei der Python-Programmierung

Ich habe bei der Python-Programmierung immer Tabulatoren zum Einrücken verwendet. Aber dann stieß ich hier auf eine Frage zu SO, in der jemand darauf hingewiesen wurde, dass die meisten Python-Programmierer Leerzeichen anstelle von Tabulatoren verwenden, um Fehler von Editor zu Editor zu minimieren.

Wie macht das einen Unterschied? Gibt es andere Gründe, warum man anstelle von Tabs Leerzeichen für Python verwenden würde? Oder stimmt es einfach nicht?

Sollte ich meinen Editor so ändern, dass er anstelle von Tabulatoren sofort Leerzeichen einfügt oder so weitermacht wie bisher?

310
Hannes Ovrén

Weil PEP-8 uns auffordert, Leerzeichen zu verwenden.

279

Müde von der Verfolgung nach Einrückung Tippfehlern (8 Leerzeichen? Nein, 7 oops 9 ...) habe ich meine Quellen auf 'Tabs only' umgestellt.

1 Tab == 1 Einzugsebene, Punkt

Der Punkt ist: Wenn Sie die Einrückung mit 4, 8 oder pi/12 Zeichen anzeigen möchten, ändern Sie einfach die Einstellungen in Ihrem Texteditor.

(Persönlich verwende ich einen Tab mit 4 Zeichenbreiten ... aber einige würden 3 oder 8 Platz bevorzugen oder sogar Schriftarten mit variabler Breite verwenden.)

426
yota

So sprach der Herr: Du sollst mit vier Leerzeichen einrücken. Nicht mehr und nicht weniger. Vier soll die Anzahl der Felder sein, die du einrücken sollst, und die Anzahl deiner Einrückungen soll vier sein. Acht sollst du weder einrücken noch zwei einrücken, außer dass du dann zu vier übergehst. Tabs sind richtig. - Georg Brandl

190
pillmuncher

VERWENDEN SIE EINEN EDITOR, DER TAB-ZEICHEN ANZEIGT (in diesem Fall alle Leerzeichen). Sie programmieren, schreiben keinen Artikel.

Ich benutze Tabs. In den Registern ist kein Platz für einen Fehler mit einem Leerzeichen (wenn Sie sie sehen können). Das Problem IS, dass die Leute verschiedene Editoren verwenden, und das einzige, was auf der Welt üblich ist, ist: Tab == Einzug, wie oben. Einige Leute kommen mit der Tabulatortaste auf die falsche Anzahl von Leerzeichen oder führen sie manuell aus und machen ein Chaos. TABs und verwenden Sie einen echten Editor. (Dies steht nicht nur im Gegensatz zum PEP, es geht auch um C/C++ und andere Whitespace-agnostische Sprachen).

/ tritt aus der Seifenkiste

76
EmTee

Mein Hauptgrund für die Verwendung von Tabulatoren über Leerzeichen ist die Rücktaste. Wenn ich in einer Zeile bin und eine Einrückung nur in dieser einen Zeile rückwärts entfernen möchte, muss ich die Rücktaste 4x drücken, wenn es Leerzeichen wäre. Ich muss es nur einmal treffen, wenn es eine Registerkarte ist.

Ich werde weiterhin Tabulatoren verwenden, da es - wie bereits erwähnt - einfacher ist, Tabulatoren in Leerzeichen umzuwandeln, nicht jedoch umgekehrt.

Ich denke, ich möchte ein einfaches Programm schreiben, das Code mit Leerzeichen in Code mit Tabulatoren umwandelt, weil ich hassen Leerzeichen ausflippen kann. Sie treiben mich an die Wand!

Oh! Und wenn Sie mit den Pfeiltasten nach links und rechts navigieren, ist es immer ein Schmerz im Arsch, wenn es Leerzeichen gibt.

UPDATE: Sublime Text 3 löscht jetzt eine vollständige Registerkarte mit der Rücktaste. Die Navigation mit den Pfeiltasten ist jedoch immer noch mühsam.

 Tabs vs. Spaces for Indentation

UPDATE: Ich benutze jetzt vscode und schrieb auch eine TabSanity-Erweiterung , um Backspace, Delete und die Pfeiltasten-Navigation zu lösen.

 TabSanity Extension in Action

65
jedmao

Die "Pythonic" -Methode ist die Verwendung von 4 Leerzeichen pro Eindruckebene. Der Python-Interpreter erkennt jedoch Leerzeichen oder Tabulatoren. Die einzige gottcha ist, dass Sie niemals Leerzeichen und Tabulatoren mischen müssen, wählen Sie die eine oder die andere aus. Das heißt, die Spezifikation empfiehlt Leerzeichen. Die meisten Entwickler verwenden Leerzeichen. Wenn Sie also keinen guten Grund haben, nicht zu gehen, würde ich sagen, dass Sie Leerzeichen verwenden.

59
ctcherry

Soweit ich das beurteilen kann, gibt es hier die Vor- und Nachteile von Tabulatoren und Leerzeichen.

Vorteile von Tabs:

  • Es sind weniger Tastenanschläge erforderlich, um den Einzug einzurücken, die Einrückung aufzuheben und die Einrückung zu durchlaufen. (Auch wenn Ihr IDE eine gewisse Klugheit in Bezug auf Leerzeichen aufweist, ist es niemals so gut wie Tabulatoren.)
  • Verschiedene Programmierer können nach Belieben unterschiedliche Registerkartengrößen verwenden.
  • Sie können den Cursor niemals "innerhalb" eines Einrückungszeichens haben. Angenommen, Sie kopieren einige Zeilen. Mit Tabulatoren können Sie vage auf den Anfang einer Zeile klicken, um Ihre Auswahl zu starten, und Sie erhalten die gesamte erste Registerkarte. Mit Leerzeichen verfehlen Sie wahrscheinlich das erste Leerzeichen, es sei denn, Sie treffen das winzige Ziel zwischen dem Zeichen und dem Rand. Um einen Einzug aus einer Zeile zu entfernen, können die meisten Editoren das Drücken der Rücktaste nicht gut handhaben, wenn sich der Cursor in der Mitte eines vierstelligen Einzugs befindet. Normalerweise wird ein Leerzeichen entfernt. Mit Tabs funktioniert es wie erwartet.
  • Konsistenz mit anderen Sprachen, sodass Sie Ihren Editor nicht für die Verwendung einrichten müssen, z. Registerkarten für C++/Java und Leerzeichen für Python.
  • Falsche Einrückungen können offensichtlicher sein (d. H. Ein zusätzlicher Tabulator ist viel größer als ein zusätzlicher Abstand).

Nachteile der Tabs:

  • Die meisten Python -Programmierer verwenden Leerzeichen, damit Sie gegen die Konvention verstoßen.
  • Die Verwendung von Leerzeichen zum Ausrichten mehrzeiliger Anweisungen ist einfacher als die Verwendung von Tabulatoren. Sie könnten Tabulatoren für Einrückungen und Leerzeichen für die Ausrichtung verwenden, aber in Python scheint dies ein bisschen riskant zu sein!

Es gibt einige Nicht-Probleme, die von einigen Leuten übergangen werden:

  1. Es kann vorkommen, dass in Einrückungen mit Tabulatoren streunende Leerzeichen auftreten. Praktisch alle IDEs/Editoren unterstützen die Darstellung von Leerzeichen, und es ist fast genauso wahrscheinlich, dass in Einrückungen mit Tabulatoren streunende Leerzeichen auftreten. Ich kann sowieso nicht sehen, dass dies ein häufiger Fehler ist. Außerdem werden die meisten Einrückungsfehler von Python abgefangen, und gute IDEs sollten in der Lage sein, verschiedene Einrückungen hervorzuheben.

  2. Sie können Dinge nicht einfach mit Tabulatoren ausrichten: Dies ist der Fall, wenn Sie eine zeichengenaue Ausrichtung anstreben, PEP-8 empfiehlt dies jedoch, und Python eignet sich nicht für mehrzeilige Anweisungen sowieso.

  3. Die Benutzer haben unterschiedliche Einstellungen für die Größe der Tabulatoren in ihren Editoren, sodass Ihr Code an verschiedenen Stellen anders aussieht: Ja, das ist tatsächlich eine vorteilhafte Funktion von Tabulatoren.

Ich habe damit begonnen, Leerzeichen zu verwenden, um mit anderem Python Code übereinzustimmen, aber um ehrlich zu sein, ist es frustrierend genug, dass ich wahrscheinlich wieder zu Tabulatoren wechseln werde. Viel hängt von den Fähigkeiten Ihrer IDE ab, aber meiner Erfahrung nach ist keine Unterstützung von IDE für Leerzeicheneinrückungen so gut wie die Verwendung von Tabulatoren.

Es sei denn, Sie mögen es wirklich nicht, mit den meisten (vermutlich) unvereinbar zu sein nicht alle!) Python Verwenden Sie Tabulatoren und aktivieren Sie die Whitespace-Visualisierung und die Hervorhebung von Einrückungen (falls verfügbar). Der Hauptgrund für mich ist die einfache Auswahl und die (ziemlich signifikante IMO) Reduzierung der Tastenanschläge. Einige Konventionen sind dumm.

Update : Ich habe festgestellt, dass es auf der ganzen Welt einen Editor gibt (mit Ausnahme von Unsinn wie Vim), der Leerzeichen als Einrückung richtig unterstützt: Atom. Es gibt eine Option namens "Atomic Tabstops", mit der sich 4 Leerzeichen in jeder Hinsicht wie ein Tab verhalten (mit Ausnahme der Möglichkeit, die Größe zu ändern). Leider ist Atom ein ziemlich langsamer und aufgeblähter Editor, aber dies ist eine großartige Funktion, und wenn Sie Leerzeichen verwenden müssen, ist dies möglicherweise eine gute Option. Hoffentlich werden es eines Tages andere Redakteure unterstützen. Hier ist das Problem für VSCode .

46
Timmmm

Ich bin kürzlich auf einen Artikel mit dem Titel Python: Mythen über Einzug gestoßen, in dem diese und verwandte Fragen behandelt werden. Der Artikel hat gute Gründe, die Verwendung von Leerzeichen beim Schreiben von Python-Code zu empfehlen, es gibt jedoch durchaus Raum für Unstimmigkeiten.

Ich glaube, es stimmt, dass die meisten Python-Programmierer nur Leerzeichen verwenden.

25
Greg Hewgill

Verwenden Sie einen Editor, mit dem Sie beim Drücken der TAB-Taste Leerzeichen bis zum Tabulator einfügen können, anstatt ein\t-Zeichen einzufügen. Und dann vergiss es.

17

Sie KÖNNEN Registerkarten und Leerzeichen mischen ... ABER ein Tabulator wird als die gleiche Einrückung wie 8 Leerzeichen betrachtet. Wenn Ihr Editor also nicht so eingestellt ist, dass ein Tabulator 8 Leerzeichen enthält, fragen Sie beim Mischen nach Problemen.

Die einzige Unannehmlichkeit bei der Verwendung von Leerzeichen anstelle von Registerkarten besteht darin, dass Sie eine Einrückungsebene nicht einfach entfernen können. Sie müssen statt nur einer Registerkarte vier Leerzeichen entfernen.

11
Ikke

Ich bin der festen Überzeugung, dass Tabulatoren unabhängig von der historischen Konvention einfach die bessere Wahl sind und Leerzeichen in jeder zukünftigen Zeile von geschriebenem Python-Code ersetzen sollten. Als würde man einen inkompetenten Tyrannen rausschmeißen. Mein Grund dafür ist: Einfachheit als Kernwert . Verwenden Sie zwei oder vielleicht vier Zeichen für die semantische Aufgabe von einem? Es gibt keine Rechtfertigung außerhalb der Tradition, IMO.

9
Robin

Tabulierungsregel Dasselbe Argument für verschachtelte Schleifen, und Sie möchten die äußere Schleife um 1 Ebene zurückbringen. Tipp: Wenn Sie alten mit Leerzeichen durchsetzten Python-Code in Registerkarten konvertieren möchten, verwenden Sie das TabOut-Dienstprogramm, das als ausführbare Datei auf http://www.textpad.com/add-ons/ verfügbar ist.

9
Skippy VonDrake

Als ich Python zum ersten Mal lernte, wurde ich von der Idee eines bedeutenden Leerraums etwas abgeschreckt, da die meisten Sprachen unflexibel sind. Trotzdem war ich beeindruckt von Pythons Fähigkeit, verschiedene Einrückungsstile zu verstehen. Bei der Auswahl des für ein neues Projekt zu verwendenden Stils halte ich es für wichtig, zwei Dinge zu berücksichtigen.

  1. Zunächst ist es wichtig zu verstehen, wie Python Einrückungen interpretiert. Bryan Oakley erwähnte die Möglichkeit von Off-by-One-Fehlern bei der Verwendung von Registerkarten. Dies ist jedoch mit den Standardinterpreter-Einstellungen nicht möglich. Eine bessere Erklärung dafür gibt es in Learning Python von O'Reilly Media .

Grundsätzlich gibt es eine Variable (die geändert werden kann, indem ein Kommentar oben in der Quelldatei # tab-width: eingefügt wird), der die Tabulatorbreite definiert. Wenn Python auf eine Registerkarte stößt, wird der Eindrückabstand auf das nächste Vielfache der Tabulatorbreite erhöht. Wenn also ein Leerzeichen gefolgt von einem Tabulator an der linken Seite der Datei eingegeben wird, ist das nächste Vielfache der Tabulatorbreite 8. Wenn ein Tabulator für sich eingegeben wird, passiert dasselbe.

Auf diese Weise ist es sicher, wenn Ihr Editor richtig konfiguriert ist, Registerkarten zu verwenden und sogar Tabulatoren und Leerzeichen zu mischen. Solange Sie die Registerkarte Ihres Editors auf dieselbe Breite wie die Deklaration der Breite der Python-Registerkarte (oder 8, falls diese nicht vorhanden ist) festlegen. Im Allgemeinen ist es keine gute Idee, einen Editor mit einer anderen Tabulatorbreite als 8 Leerzeichen zu verwenden, es sei denn, Sie geben die Tabulatorbreite in der Datei an.

  1. Zweitens besteht ein Großteil des syntaktischen Designs von Python darin, die Lesbarkeit von Code und den konsistenten Stil zwischen Programmierern im selben Projekt zu fördern. Das heißt, die Frage wird für ein bestimmtes Projekt, was den Code für die am besten lesbaren von den Leuten macht, die an dem Projekt arbeiten. Es ist sicherlich eine gute Idee, einen konsistenten Einrückungsstil beizubehalten, aber abhängig von der Plattform und dem Editor, die vom Projekt verwendet werden, kann ein anderer Stil für verschiedene Projekte sinnvoll sein. Wenn es keinen zwingenden Grund gibt, sich nicht an PEP 8 zu halten, ist es sinnvoll, dies zu tun, da es den Erwartungen der Menschen entspricht.

Ich habe Projekte getroffen, die erfolgreich eine Mischung aus Registerkarten und Leerzeichen verwenden. Grundsätzlich werden Leerzeichen verwendet, um kleine Abschnitte einzurücken, wobei die Tatsache, dass es sich in einem eingerückten Abschnitt befindet, relativ unwichtig ist. während Registerkarten verwendet werden, um die Aufmerksamkeit des Lesers auf ein großes Strukturmerkmal zu lenken. Klassen beginnen beispielsweise mit einer Registerkarte, bei der einfache Bedingungsprüfungen innerhalb einer Funktion zwei Leerzeichen verwenden.

Registerkarten sind auch nützlich, wenn Sie mit großen Textblöcken arbeiten, die mehrere Ebenen eingerückt sind. Wenn Sie 3-4 Einrückungsebenen verlassen, ist es viel einfacher, sich an der richtigen Registerkarte auszurichten, als an der richtigen Anzahl von Leerzeichen. Wenn ein Projekt nicht den von PEP 8 empfohlenen Stil verwendet, ist es wahrscheinlich am besten, einen Style Guide irgendwo in eine Datei zu schreiben, damit das Einrückungsmuster konsistent bleibt und andere Personen explizit lesen können, wie sie ihren Editor entsprechend anpassen.

Außerdem gibt es in Python 2.x die Option -t, um Warnungen zu gemischten Registerkarten und Leerzeichen auszugeben, und -tt, um einen Fehler zu melden. Dies gilt nur für gemischte Registerkarten und Leerzeichen innerhalb desselben Bereichs. Python 3 geht von -tt aus. Soweit ich gefunden habe, gibt es keine Möglichkeit, diese Prüfung zu deaktivieren.

8
Perkins

Ich bin in erster Linie ein C++ - Programmierer, aber manchmal enthalten meine Projekte kleine Mengen von Python. Ich benutze Registerkarten, um meinen C++ - Code einzuziehen. Das bedeutet, dass ich hier drei Möglichkeiten habe:

  1. Verwenden Sie Tabulatoren in C++ und Leerzeichen in Python. Dadurch können meine C++ - Dateien so bleiben, wie sie sind, und ich folge der PEP-8-Empfehlung. Ich bin jedoch in meinem Projekt inkonsistent.
  2. Ändern Sie meinen C++ - Code, um Leerzeichen zu verwenden. Dadurch können alle meine Dateien in meinem Projekt konsistent sein, und ich befolge die PEP-8-Empfehlung. Ich muss jedoch alle meine C++ - Dateien ändern. Ich halte das für eine schlechte Sache, weil ich Tabs bevorzuge.
  3. Verwenden Sie Tabulatoren in meinem C++ - Code und Python-Code. Dadurch wird mein gesamtes Projekt konsistent und ich kann meinen bevorzugten Einrückungsstil verwenden: Tabs. Der Nachteil ist, dass ich den PEP-8-Standard nicht befolge.

Für meine Projekte gehe ich generell mit Option 3.

7
David Stone

Ein Editor-zu-Editor-Fehler tritt auf, wenn Sie gemischte Einrückung in einer Datei haben. Dies ergibt sich wie folgt: Ein Codeblock wird mit 4 Leerzeichen eingerückt und dann eine Einrückungsebene "in", er wird mit Tabulatoren eingerückt. Nun hatten die Heiden, die dies getan hatten (das Mischen von Tabs und Leerzeichen), also seine Tabs ebenfalls 4 Leerzeichen, sodass er keine Probleme sieht und Python keine Probleme sieht.

Jetzt kommt unser Opfer später und seine Tabs sind auf 8 Felder gesetzt. Nun glauben unsere Opfer, der Code sieht total durchgeknallt aus, und behebt ihn von entfernt eine Einrückungsebene, wodurch der Code look so aussieht, als wäre er immer noch 2 Ebenen Einzug, aber ist wirklich eine Ebene. An diesem Punkt bricht die Hölle los.

Die Lektion hier ist, dass Sie niemals Tabs und Leerzeichen mischen sollten. Wenn Sie sich daran halten, ist es einfach, Ihren Code in Leerzeichen oder Tabulatoren wieder einzufügen, unabhängig davon, welche Sie persönlich verwenden. Um sicherzustellen, dass Sie keine Registerkarten und Leerzeichen mischen, führen Sie immer python mit -tt aus. Dies führt zu einem Fehler, wenn Registerkarten und Leerzeichen gemischt werden.

Bei Tabulatoren und Leerzeichen verwende ich Tabulatoren, bei denen die Einrückung vom Erscheinungsbild getrennt wird. Es ist viel einfacher, das Erscheinungsbild von Code zu ändern, wenn er mit Tabulatoren eingerückt ist, als mit Leerzeichen. Ich weiß, dass dies im Gegensatz zu dem ist, was 99% der Python-Programmierer tun, aber dies ist meine Einstellung persönlich, und es ist auf jeden Fall einfach, eine Tab-Datei in eine beabstandete zu konvertieren. Das Gegenteil trifft nicht immer zu, da Sie versehentlich 4 Leerzeichen in Strings usw. auspacken können.

7
freespace

Erfahrung und PEP-8 beide schließen eindeutig, dass das Vermischen von Räumen und TABs vermieden werden sollte .. Wenn Sie sie mischen möchten, müssen Sie Whitespace in der IDE visualisieren - aber dann verlieren Sie den Vorteil von Pythons Einzug, der Bereiche leicht sichtbar macht. Durch die Anzeige von Whitespace in einem IDE wird die Anzeige überladen.

Wenn es sich um TABs oder Leerzeichen handelt, müssen es aus einem einfachen Grund Leerzeichen sein: Man kann fast alle IDEs und Texteditoren wechseln, um Tabulatoren automatisch durch Leerzeichen zu ersetzen. Das Gegenteil trifft jedoch nicht zu.

Auch wenn IDEs vorhanden sind, die führende Leerzeichen in einer Zeile automatisch in Registerkarten konvertieren können, führt dies letztendlich zu einer Mischung aus Registerkarten und Leerzeichen. Berücksichtigen Sie mehrzeilige Anweisungen wie Funktionsaufrufe mit vielen Parametern oder Dokumentzeichenfolgen. Während "Ascii-Art" auch vermieden werden soll, kann es leicht passieren, dass nach den führenden Tabs ein Leerzeichen übrig bleibt.

Andere Antworten brachten mehrere Argumente für Tabs:

  • Das Schlagen von TAB ist effizienter. Dies ist natürlich richtig, aber alle Texteditoren erlauben es sofort, die gewünschte Anzahl von Leerzeichen einzufügen, wenn eine Tabulatortaste gedrückt wird
  • Einrücken/Einrücken ist einfacher, wenn Sie nur einen Tabulator anstelle von 2/3/4/8 Leerzeichen entfernen müssen. Richtig, aber die meisten Texteditoren erlauben dies ohnehin automatisch: Blockauswahl, Einrücken/Zuweisen sind grundlegende Funktionen eines Programmiereditors, beispielsweise das Kommentieren/Entkommentieren. Wenn ein Texteditor dies nicht implementiert hat, sollte er zumindest eine einfach zu verwendende Makrofunktionalität haben, mit der dasselbe erreicht werden kann.
  • Verschiedene Programmierer mögen unterschiedliche Eindrückbreiten. Das ist wahr und ein klarer Vorteil, nur TABs zu verwenden. Das Problem ist die Interaktion mit anderen Personen und/oder Teams. Damit dies in der realen Welt funktioniert, muss sich jeder darauf einigen, dass nur TABs verwendet wird. Da dies nicht geschehen ist, funktioniert es trotzdem nicht. In einem realen Szenario gibt es eine Reihe von Codierungsrichtlinien, mit denen sich ein Projekt ohnehin einverstanden erklärt, und die Einrückungsmethode ist sicherlich eine davon - selbst in anderen Programmiersprachen, bei denen die Auswirkungen "nur" visuell sind.

Im Wesentlichen ist der Hauptpunkt, dass die meisten (wenn nicht alle) Antworten hier fehlen, die Interaktion zwischen Teams oder Einzelpersonen, insbesondere in Szenarien, in denen die Teilnehmerliste zu Beginn nicht bekannt ist. Wenn Code auf Code trifft, müssen entweder alle Tabulatoren verwenden, oder alle müssen Leerzeichen verwenden. Es kann nicht gemischt werden, ohne dass irgendwann Funktionsprobleme auftreten. Menschen sind nicht perfekt. Werkzeuge sind nicht perfekt. Aus diesem Grund sollten wir TABs überhaupt nicht verwenden.

Keine Antwort ist vollständig ohne den Link, den Greg in seiner Antwort angegeben hat bereits: Python: Mythen über Einzug

7
cfi

Jeder hat unterschiedliche Präferenzen darüber, wie viel Code eingerückt werden soll. Angenommen, Sie teilen den Code mit jemandem und er oder sie hat unterschiedliche Präferenzen in Bezug auf die Einrückung. Wenn sich die Einrückungen in Registerkarten befinden, kann Ihr Freund die Registerbreite in den Editoreinstellungen immer ändern. Wenn sich die Einrückungen jedoch in Leerzeichen befinden, muss der Freund den Quellcode tatsächlich ändern, wenn er oder sie ihn nach seinen Vorstellungen einstellen möchte. Wenn Sie dann die Änderungen Ihres Freundes erhalten, können Sie sich entscheiden, die Änderungen wieder an Ihre Vorlieben anzupassen. In diesem Fall müssen Sie sich entweder mit der Langeweile beschäftigen, die Einrückungsebenen hin und her zu ändern, oder eine Person muss die Präferenzen der anderen Person in die Einzugsebene übernehmen. Wenn sowohl Sie als auch Ihr Freund Registerkarten verwenden, ist die Tatsache, dass Sie unterschiedliche Einstellungen haben, kein Problem, da Sie jeweils unterschiedliche Einrückungsebenen sehen können, während der Code unverändert bleibt. Deshalb sind Tabs meiner Meinung nach in allen Programmiersprachen besser als Leerzeichen für Einrückungen. 

6
Zhehao Mao

Es gibt ein Szenario, in dem Registerkarten einfach nicht funktionieren, nämlich: Je nach verwendetem Codierungsstil müssen Sie möglicherweise einige Codezeilen mit einer Genauigkeit von einem Leerzeichen einrücken, d. H .:

def foobar():
    x = some_call(arg1,
                  arg2)

In diesem Fall funktioniert die Verwendung reiner Tabs überhaupt nicht. Die Verwendung von Registerkarten für den Haupteinzug und die Leerzeichen für den Unterzug sind möglich, verstoßen jedoch gegen die strenge Regel, die beiden nicht zu mischen.

Dies ist jedoch nicht der Fall, wenn Sie ein Codierungsstil-/-konventionsdokument verwenden, das Situationen wie im obigen Codebeispiel vermeidet.

5
Erik Allik

Zusätzlich zu allen bereits aufgeführten Argumenten finde ich diese recht wichtig (aus Mythen über Einrückung ):

Außerdem werden Registerkarten häufig beim Kopieren und Einfügen zerstört oder falsch konvertiert, oder wenn ein Quellcode in eine Webseite oder einen anderen Markup-Code eingefügt wird.

Ein anderes Argument (stark umgebungsspezifisch) gegen Registerkarten ist, dass sie manchmal auf den Telefontastaturen fehlen . Möglicherweise kann dies durch die Installation einer alternativen Tastatur behoben werden.

Ein Argument für Tabs, von denen noch niemand erwähnt zu haben schien, ist, dass 1 Tab 1 Zeichen (0x09, 1 Byte in der Datei) und 4 Leerzeichen 4 Zeichen (4 x 0x20, 4 Byte in der Datei) sind. ; Daher führt die Verwendung von Räumen zu einer vierfachen Platzverschwendung.

Zum Abschluss dieser inkohärenten Liste von Argumenten möchte ich die Antwort von Tim Peters in der Ausgabe 7012 zitieren: Tabs ist besser als Leerzeichen für die Einrückung :

Der Python-Standard "Leerzeichen" gilt für verteilter Code. Jahrelange frühe Erfahrung lehrte uns zweifellos, dass Tabs verursachten endlose Probleme für shared code (...)

4
chronos

Das Problem bei der Verwendung von Leerzeichen anstelle von Tabulatoren ist, dass die Dateigröße so unglaublich groß wird. Zum Beispiel könnte eine 500-kb-Datei mit Leerzeichen auf 200kb reduziert werden, wenn Leerzeichen für Tabulatoren ausgetauscht werden. Aus diesem Grund verwende ich immer Tabulatoren.

Eine kleinere Dateigröße bedeutet schnelleres Laden, Kompilieren, Ausführen (in einigen Fällen) usw.

Für mich gibt es keinen Sinn, Leerzeichen zu verwenden, aber wenn jemand einen Editor verwendet, der Probleme mit Tabs hat, kann er "\ t" durch "" oder "" oder was auch immer ersetzen.

3
Acecool

Wie macht das einen Unterschied?

Einige Editoren sind standardmäßig so konfiguriert, dass sie ein einzelnes Tabulatorzeichen durch eine festgelegte Anzahl von Leerzeichen ersetzen, andere jedoch nicht. Wenn alle Leerzeichen verwenden, kann dieser Unterschied in den Standard-Editoreinstellungen ignoriert werden.

Gibt es andere Gründe, warum man anstelle von Tabs Leerzeichen für Python verwenden würde? Oder stimmt es einfach nicht?

Ja, es gibt andere triftige Gründe, auf die ich vor vielen Antworten hingewiesen habe. "PEP-8" sagt dies jedoch, ist KEINER dieser Gründe. Dies beruht auf dem sich selbst andauernden Mythos, dass PEP-8 der Codierungsstandard für all Python-Code ist, während es tatsächlich nur der Codierungsstandard für den Standardsatz von Python-Bibliotheken ist. Einige behaupten, dass PEP-8 weithin akzeptiert wird, und andere behaupten, dass die meisten Python-Programmierer Leerzeichen anstelle von Tabulatoren verwenden. Ich möchte um Nachweise für diese Behauptungen bitten, da die Anzahl der Stimmen auf dieser Website CLEARLY zeigt, dass Tabs von den Massen bevorzugt werden. Ich finde es ziemlich schade, dass Sie "PEP8 sagt ja" als Antwort auf Ihre Frage akzeptiert haben, obwohl es tatsächlich viele andere Antworten gibt, die die relativen Vor- und Nachteile von Leerzeichen und Registerkarten erklären.

Sollte ich meinen Editor so ändern, dass er anstelle von Tabulatoren sofort Leerzeichen einfügt oder so weitermacht wie bisher?

Es kommt darauf an, und die Antwort auf diese letzte Frage ist, wo ich dachte, ich könnte diesem Thread tatsächlich etwas hinzufügen. IMHO, unabhängig von der verwendeten Sprache, hängt der beste Codierungsstandard von der Situation ab, in der Sie sich befinden:

  • Wenn Sie bereits mit einer bereits vorhandenen Codebasis gearbeitet haben: Seien Sie nicht schwierig, befolgen Sie die vorhandenen Codierungsstandards
  • Wenn ein Team von Grund auf ein neues Projekt startet: Besprechen Sie, entscheiden Sie sich zu Beginn als Team für einen Codierungsstandard und halten Sie sich daran
  • Wenn Sie solo gehen: Machen Sie das, was Sie am glücklichsten und produktivsten macht

In welche Situation fallen Sie?

Um meine Haltung klar zu machen, benutze ich für meine eigenen Soloprojekte Tabs, weil Tabs für mich sinnvoller sind und ich bin mit Tabs produktiver.

3
wookie919

Dies ist PEP 8 Stand Juli 2017:

 Enter image description here

Es scheint, dass diese Aussage keinen Raum für andere Entscheidungen lässt.

Dies ist jedoch nicht nur das, was uns PEP 8 sagt, einige Zeilen später:

 Enter image description here

In der obigen Beschreibung drückt die erste Anweisung ein preference für Leerzeichen aus, und die zweite Anweisung bestätigt das Vorhandensein von mit Tabulatoren eingerücktem Code und diese Präferenz für einige Codierer.

So: PEP 8 ist toleranztolerant für Tabulatoren ..__ Es toleriert jedoch nicht, dass Tabulatoren und Leerzeichen für die Einrückung gemischt werden, was, da die Einrückung selbst zwingend ist, verständlich ist.

Es kann erwähnenswert sein, dass Googles Python-Codierungsstil auch der 4-Leerzeichen-Regel folgt.

Es gibt andere verschiedene Argumente und Begründungen entweder für Tabulatoren oder 4-Platz.

Wenn Sie in einem Unternehmen arbeiten, das PEP 8 durchgesetzt hat, oder Ihren Code regelmäßig mit anderen Personen teilen, die PEP 8 befolgen, bestimmt der gesunde Menschenverstand 4-Leerzeichen. Ich bin (war vielleicht) an Tabs von C/C++ gewöhnt. Bei einer richtig eingestellten IDE wird der Unterschied jedoch minimal.

3
calocedrus

Verwenden Sie Leerzeichen anstelle von Registerkarten, nur um mehr Geld zu verdienen :)

Ref .: Entwickler, die Leerzeichen verwenden, verdienen mehr Geld als diejenigen, die Tabs verwenden (Blogpost-Stapelüberlauf). 

3
Antonio

Ich lese hier also alle Antworten und frage mich, wie ich PEP-8 befolgen kann, ohne die Rücktaste mehrmals zu schlagen, nur um die Einrückung zu entfernen. Ich schaue auf meine Logitech-Gaming-Tastatur mit all ihren ausgefallenen Makroschaltflächen und einem Licht Birne leuchtet in meinem Kopf. Geöffnete Logitech-Software, definierte ein paar Makros für die Schaltflächen direkt neben der Tab-Schaltfläche, und das Problem wurde gelöst. Eine Taste fügt vier Leerzeichen hinzu, die andere viermal hintereinander. Tolle. Einfach unglaublich. So einfach, die Knöpfe auch mit meinem kleinen Finger zu treffen. Sehen Sie sich das an: "" <- vier Leerzeichen! Mit einem Knopfdruck! Wenn ich dir die Backspaces zeigen könnte, würde ich das auch tun. Holen Sie sich eine Logitech G105-Tastatur und alle Ihre Probleme werden verschwinden!

2
zephos2014

Ich glaube, dass es eine Lösung gibt, um beides zu haben:

  1. Kompatibilität mit PEP-8 und Verwendung von Leerzeichen 
  2. Bequemlichkeit der Verwendung von Tabulatoren anstelle von 4 Leerzeichen

Gehen Sie in Notepad ++ zu "Einstellungen" -> "Tabulatoreinstellungen" und wählen Sie "Python" aus der Liste auf der rechten Seite. Dann stellen Sie sicher, "Tab size: 4", und aktivieren Sie das Kontrollkästchen "[Tab] durch Leerzeichen ersetzen". In diesem Fall können Sie einfach die Tabulatortaste zum Einrücken verwenden, aber Notepad ++ wandelt dies tatsächlich in 4 Leerzeichen um.

2
Saeed

Ich fange gerade erst an, finde es jedoch viel einfacher, Tabulatoren als Leerzeichen zu verwenden, und verstehe die PEP-8-Empfehlung nur für Leerzeichen nicht. Sublime Text 2 macht eine großartige Arbeit beim Visualisieren von Registerkarten mit der gebrochenen weißen gestrichelten Linie. Obwohl es Fälle gibt, in denen ich ein oder zwei Leerzeichen mischte, um Elemente einer Liste oder eines Wörterbuchs aneinander zu reihen, habe ich keine Situation erlebt, in der dies möglich wäre schädlich sein. 

1
gr33kbo1

Ich liebe Tabs, aber es ist irgendwie unvereinbar mit einer anderen Regel, die ich mag: das Limit von 80 Spalten.

Wenn Sie 4 Leerzeichen-Registerkarten auswählen und 10 Register einfügen, bleibt 40 Zeichen für die Begrenzung von 80 Spalten frei. Wenn ein anderer Codierer 8 Leerzeichen-Registerkarten bevorzugt, erscheint dieselbe Zeile mit 120 Zeichen und nicht als gültige 80 Spaltenzeile!

Wenn Sie ein Limit von 80 Spalten definieren möchten, müssen Sie eine Länge für eine Registerkarte auswählen. In diesem Fall macht das Vorhandensein von x Leerzeichen oder einem Tab mit der Länge x keinen Unterschied.

Bearbeiten: verwandter Thread: Maximale Zeilenlänge beibehalten, wenn Tabulatoren anstelle von Leerzeichen verwendet werden?

1
Mathieu Villion

Ich denke, einer der Hauptvorteile bei der Verwendung von Leerzeichen besteht darin, dass Sie die Variabilität bei der Wiedergabe Ihres Quellcodes in der Fülle externer Tools entfernen, die über den Choice-Editor und die Einstellungen, in denen sie konfiguriert sind, mit dem Quellcode interagieren müssen.

Als konkrete Beispiele betrachten Sie das Rendern von Python-Dokumentstrings in einem Tooltip in Visual Studio Code oder in einem Diff-Tool wie Beyond Compare oder WinMerge , Leistungs- oder Codeüberdeckungs-Tools usw. Grundsätzlich Alle diese verschiedenen anderen Schnittstellenwerkzeuge können jeweils unterschiedliche Einstellungen für die Interpretation der Registerkarten haben, und es kann ärgerlich und manchmal verwirrend sein, wenn zwischen den Toolsets, in die Sie ein- und aussteigen können, sehr unterschiedliche Dinge gefunden werden.

Kurz gesagt, Sie definieren die Ausrichtung in der Quelle, anstatt eine einheitliche Konfiguration für die Suite von Werkzeugen in Ihrem Arsenal zu definieren. Leerzeichen werden streng in Monospace-Zeichensätzen interpretiert, um aufgrund der Definition der Zeichensätze eine zuverlässige und konsistente Ausrichtung über den gesamten Werkzeugbereich zu gewährleisten, nicht durch die Implementierung/Konfiguration eines Registers für die Wiedergabe von Drittanbietern.

Ein weiterer Blickwinkel besteht darin, die Quelle für führende Registerkarten zu kopieren, um sie an einem Terminal auszuführen, an dem das Tabulatorzeichen eine unbeabsichtigte Vervollständigung der Registerkarten auslösen kann. Wenn Sie beispielsweise die folgende Python-Quelle (Registerkarten, die als Einzug verwendet werden) kopieren,

cmd_create_db = '''CREATE TABLE test (
    Col1 INTEGER,
    Col2 INTEGER,
    Col3 TEXT)'''

möglicherweise sehen Sie Folgendes (sichtbar am integrierten Terminal von Visual Studio Code) ...

>>> cmd_create_db = '''CREATE TABLE test (
... .DS_StoreCol1 INTEGER,
... .DS_StoreCol2 INTEGER,
... .DS_StoreCol3 TEXT)'''
>>> cmd_create_db
'CREATE TABLE test (\n.DS_StoreCol1 INTEGER,\n.DS_StoreCol2 INTEGER,\n.DS_StoreCol3 TEXT)'

(Nebenbei gesagt: Ich hatte mich gefragt, ob diese Beobachtung der Konsistenz über die Werkzeuge hinweg ein Kennzeichen eines diskriminierenden Geistes eines scharfen Entwicklers ist, der die Welt ordnen möchte, was auf einen Hinweis auf die Gehaltsunterschiede beim Stack Overflow hindeutet.)

1
jxramos

Ich verwende zwei Leerzeichen-Einrückungen und einen Editor (Kwrite), der Leerzeichen anstelle von Tabulatoren einfügt, wenn ich die Tabulatortaste drücke.

0
David Locke

Da es in letzter Zeit mit vorhandenem Code zu tun hatte, bei dem Leerzeichen und Tabulatoren gemischt wurden, ist das wirklich verwirrend.

Wenn Sie mischen (was Sie eigentlich nicht tun sollten, was aber leider da draußen existiert), scheint "1 Tab == 1 Einzugsebene" nicht wahr zu sein.

Nehmen Sie das folgende Beispiel (versucht mit Python 2.7):

# Mostly use spaces
class TestClass:
    def __init__(self):
        self.total = 0

    def add(self, x):
        # 8 spaces at the start of the following line:
        self.total += x
        # SO automatically uses spaces, but use tabs in the next 2 lines.
        # One tab at the start of the following line:
        if self.total > 10:
                # Two tabs at the start of the following line:
                print "Greater than 10!"
        # Now use spaces again.

        return self.total

tc = TestClass()

print "Total: %d" % (tc.add(5),)
print "Total: %d" % (tc.add(5),)
print "Total: %d" % (tc.add(5),)

Hier gibt es 4 Leerzeichen vor def add(...) (1 Identifikationsebene), 8 Leerzeichen vor self.total += x (2 Einrückungsebenen) und eine einzige Registerkarte vor if self.total > 10.

Diese einzelne Registerkarte verhält sich jedoch wie zwei Einrückungsebenen, da dieser Code funktioniert. Wenn Sie dagegen alle Registerkarten durch 4 Leerzeichen ersetzen (eine einzige Einrückungsebene, hier befinden sich die def innerhalb der Klasse), erhalten Sie vor return einen unerwarteten Einzugsfehler, da er sich nicht mehr in einem def-Block befindet.

Dies ist really, das mit Editoren verwechselt wird, die Registerkarten als 4 Zeichen anzeigen. Natürlich kann dies konfiguriert werden, aber dies wirkt sich auch auf die Betrachter von Quellcode (z. B. GitHub) aus, bei denen die Konfiguration nicht unbedingt einfach ist (oder sofort sichtbar ist, wenn Sie dies tun müssen).

Die Registerkarte v.s. Das Raumverhalten hängt immer vom Editor ab:

  • Wenn Ihr Editor bei jedem Drücken der Tabulatortaste automatisch Leerzeichen einfügt, wird die richtige Anzahl von Leerzeichen eingefügt, sodass ein anderer Editor denselben Stil anzeigt.
  • Wenn Ihr Editor keine Registerkarten verwendet, werden Sie möglicherweise nicht bemerken, dass eine Zeile Leerzeichen anstelle von Registerkarten verwendet (insbesondere wenn andere Editoren im Projekt verwendet werden).

Beide haben ihre Schattenseiten. Die Quintessenz ist, dass es eine willkürliche Auswahl zwischen Tabulatoren und Leerzeichen geben muss, sie sollten jedoch niemals gemischt werden. Da Sie nie wissen, wie Ihr Code später gelesen und verwendet wird, ist es ratsam, eine Konvention zu haben, die alle Python-Codierer betrifft. PEP-8 sagt Leerzeichen, also sei es.

Was zählt ist nicht auf Java-Weise :

Vier Leerzeichen sollten als Einrückungseinheit verwendet werden. Die genaue Die Konstruktion der Einrückung (Leerzeichen vs. Tabulatoren) ist nicht festgelegt. Tabs muss genau alle 8 Leerzeichen gesetzt werden (nicht 4).

Ja ... 1 Tab = 2 Einrückungsebenen in der Java-Welt! Zum Glück hat es bei der Zusammenstellung nicht die gleiche Bedeutung.

0
Bruno

Die Leute verwenden verschiedene Editoren für denselben Code. Diese Editoren stellen eine Registerkarte auf dem Bildschirm anders dar. Wenn Sie an einem Editor arbeiten, der einen Tabulator als 4 Leerzeichen darstellt, wenn Sie die erste Zeile um "\t " und die zweite um "\t\t" einrücken, sehen sie aus, als befänden sie sich in derselben Einzugsebene: 8 Leerzeichen. 

Der Python-Interpreter kennt Ihren Editor nicht und muss die Registerkarte als eine Art Einzug interpretieren. Tatsächlich interpretiert es die Registerkarte als 8 Leerzeichen, so dass andere Einrückungsebenen als beabsichtigt angezeigt werden: 12 Leerzeichen für die erste Zeile, 16 Leerzeichen für die zweite Zeile. Du bist geröstet. 

0

Ein etwas unklareres (zu manchen!) Argument auf der Registerseite: Mir wird gesagt, dass Registerkarten besser mit Screenreadern für Blinde funktionieren.

0
Peter Drake

Ich habe kürzlich von Tabs zu Leerzeichen gewechselt, um die PEP 8-Konformität zu gewährleisten.

Ich mochte Tabs aus zwei Gründen:

  1. Mit Registerkarten kann jeder Code mit der Einzugsebene seiner Wahl sehen; Verwenden Sie einfach Leerzeichen auf der rechten Seite und Registerkarten auf der linken Seite.
  2. machen will Tabs ziemlich schlecht

... aber nachdem mir klar wurde, wie wichtig PEP 8 geworden ist, habe ich trotzdem gewechselt. Meines Erachtens ist der Hauptwert von Leerzeichen über Tabulatoren die Einfachheit. Und PEP 8-Konformität. Ich habe mir eine Vim-Regel ausgedacht, die Leerzeichen für Python-Dateien aktiviert und Makefiles Tabulator hinterlassen würde.

0
user1277476