Warum empfiehlt Python pep-8 zum Einrücken dringend Leerzeichen über Tabulatoren?

147

Ich sehe in Stack Overflow und PEP 8, dass die Empfehlung lautet, Leerzeichen nur zum Einrücken in Python-Programmen zu verwenden. Ich kann die Notwendigkeit einer konsequenten Einrückung verstehen und habe diesen Schmerz gespürt.

Gibt es einen Grund dafür, dass Räume bevorzugt werden? Ich hätte gedacht, dass Tabs viel einfacher zu bearbeiten sind.

Quamrana
quelle
7
Lesen Sie die PEP-Diskussion, um dies zu erfahren.
E-Satis
106
1 Einrückungsstufe ist ... 1. Es ist völlig unlogisch, sich auf die Verwendung von N Leerzeichen einigen zu müssen, wenn Sie alle eine einzige Registerkarte verwenden könnten. Was übrigens genau dazu gedacht ist. Einzug. Einmal. 1 Einrückungsstufe = 1 einzelnes Zeichen, dh 1 einzelne Registerkarte. Und sie sind praktischer, da jeder Codierer frei wählen kann, wie er sie visualisieren soll. Das Verwenden von Leerzeichen ist dumm, ich habe noch nie ein einziges Argument dafür gesehen, das nicht dumm ist.
o0 '.
31
@BlueBomber und warum zwingst du die Leute nicht dazu, eine Schriftgröße und ein Farbschema zu haben, die du magst, während du dabei bist? Immer noch dumm.
o0 '.
10
@ BlueBomber nein, nein, es ist genau auf der gleichen Ebene der Absurdität.
o0 '.
9
@BlueBomber Was genau ist der Unterschied? Sie reduzieren einen Freiheitsgrad bei der Konfiguration der Umgebung eines anderen Entwicklers, ohne einen spürbaren Nutzen zu erzielen. Wenn Sie ein Diktator sein möchten und alle dazu zwingen möchten, den Code mit einem Einzug zu betrachten, der 2, 4 oder 29 Leerzeichen entspricht, können Sie dies dennoch mit Tabulatoren tun. Bitten Sie einfach Ihre Untergebenen, ihre IDE so einzustellen, dass Registerkarten entsprechend Ihrer bevorzugten Anzahl von Leerzeichen angezeigt werden. Wenn Sie nicht befugt sind, dies zu tun, sollten Sie sie vielleicht selbst entscheiden lassen, wie weit eine Einrückungseinheit für ihre Augen angenehm ist.
Asad Saeeduddin

Antworten:

111

Die Antwort wurde direkt in dem PEP gegeben [ed: diese Passage in herausgeschnitten wurde 2013 ]. Ich zitiere:

Die beliebteste Methode zum Einrücken von Python ist die Verwendung von Leerzeichen.

Welchen anderen Grund brauchen Sie?

Um es weniger klar auszudrücken: Berücksichtigen Sie auch den Umfang des PEP, wie im ersten Absatz angegeben:

Dieses Dokument enthält Codierungskonventionen für den Python-Code, der die Standardbibliothek in der Python-Hauptdistribution enthält.

Die Absicht ist, den gesamten Code, der in der offiziellen Python-Distribution enthalten ist, konsistent zu formatieren (ich hoffe, wir können uns darauf einigen, dass dies allgemein eine gute Sache ist ™).

Da die Entscheidung zwischen Leerzeichen und Tabulatoren für einen einzelnen Programmierer a) wirklich Geschmackssache ist und b) mit technischen Mitteln (Editoren, Konvertierungsskripten usw.) leicht zu handhaben ist, gibt es einen klaren Weg, alle Diskussionen zu beenden: Wählen Sie eine aus .

Guido war derjenige, der sich entschied. Er musste nicht einmal einen Grund angeben, aber er bezog sich immer noch auf empirische Daten.

Für alle anderen Zwecke können Sie dieses PEP entweder als Empfehlung verwenden oder es ignorieren - Ihre Wahl, die Ihres Teams oder Ihre Teamleiter.

Aber wenn ich Ihnen einen Rat geben darf: Mischen Sie sie nicht ;-) [ed: Das Mischen von Tabulatoren und Leerzeichen ist keine Option mehr.]


quelle
11
Einverstanden. Konsistenz ist wichtiger als Tabulatoren vs. X-Leerzeichen vs. Y-Leerzeichen.
Mike Clark
10
Ich frage mich, warum die Standardbibliothek so viele MixedCase-Methodennamen hat.
Kyle Wild
6
@dorkitude: a) niemand ist perfekt. b) historische Gründe.
8
Warum haben dann so viele Programmierer Leerzeichen vor PEP-8 verwendet? Das möchte ich wirklich wissen. Die Vorteile von Tabs scheinen mir offensichtlich, aber keine Leerzeichen.
Unschuldig
95

Nun gut, es scheint, als ob jeder stark auf Räume ausgerichtet ist. Ich benutze ausschließlich Tabs. Ich weiß sehr gut warum.

Tabs sind eigentlich eine coole Erfindung, die nach Leerzeichen kam. Sie können damit einrücken, ohne millionenfach Leerzeichen zu drücken oder eine gefälschte Registerkarte zu verwenden (die Leerzeichen erzeugt).

Ich verstehe wirklich nicht, warum jeder die Verwendung von Tabs diskriminiert. Es ist sehr ähnlich wie bei alten Menschen, die jüngere Menschen diskriminieren, weil sie sich für eine neuere, effizientere Technologie entschieden haben, und sich darüber beschweren, dass die Impulswahl bei jedem Telefon funktioniert , nicht nur bei diesen schicken neuen. "Tonwahl funktioniert nicht bei jedem Telefon, deshalb ist es falsch".

Ihr Editor kann Tabs nicht richtig verarbeiten? Holen Sie sich einen modernen Editor. Es könnte eine verdammte Zeit sein, wir befinden uns jetzt im 21. Jahrhundert und die Zeit, als ein Editor eine komplizierte High-Tech-Software war, ist lange vorbei. Wir haben jetzt Tonnen und Tonnen von Editoren zur Auswahl, die alle Registerkarten unterstützen. Sie können auch festlegen, wie viel eine Registerkarte sein soll, was Sie mit Leerzeichen nicht tun können. Tabs können nicht angezeigt werden? Was ist das für ein Argument? Nun, Sie können auch keine Leerzeichen sehen!

Darf ich so mutig sein, einen besseren Editor vorzuschlagen? Eine dieser High-Tech-Versionen, die bereits vor 10 Jahren veröffentlicht wurden und unsichtbare Charaktere aufweisen ? (Sarkasmus aus)

Die Verwendung von Leerzeichen verursacht viel mehr Lösch- und Formatierungsarbeiten. Aus diesem Grund verwenden (und alle anderen Personen, die dies wissen und mir zustimmen) Registerkarten für Python.

Das Mischen von Tabulatoren und Leerzeichen ist ein Nein-Nein und kein Argument dafür. Das ist ein Chaos und kann niemals funktionieren.

Nigratruo
quelle
26
Schauen Sie sich dazu Ihre Tastatur an. Das Symbol der TAB-Taste zeigt deutlich die Einrückung - es ist der eingerückte Zweck der Taste, nicht der von SPACE. PEP8 empfiehlt, Leerzeichen zu verwenden, ist meiner Meinung nach ein Fehler, aber es ist nur eine Empfehlung - en.wikipedia.org/wiki/Tab_character#Tab_characters
Daniel Sokolowski
29
Ich stimme diesem Beitrag voll und ganz zu. Die Verwendung von Leerzeichen ist für Dummköpfe gedacht, die gerne über diese 1 Leerzeichen bei Einrückungsfehlern stolpern. Wenn Ihre Einrückung um 1 Tab verschoben war, werden Sie es garantiert bemerken.
Sepero
12
@Zingham Niemand kann ausschließlich Tabulatoren verwenden: Tabulatoren und Leerzeichen werden immer in Kombination verwendet, was zu Inkonsistenzen führt. Ich und Tausende von anderen verwenden sie jeden Tag ziemlich konsequent. Registerkarten zum Einrücken, Leerzeichen zum Ausrichten. Welchen Teil dieses Konzepts ist für Sie so furchtbar schwer zu verstehen, und warum sind Sie davon überzeugt, dass es unmöglich ist, es konsequent anzuwenden?
antred
1
Das eigentliche Problem mit Registerkarten besteht darin, dass Sie unter dem Kommentar "# Am öffnenden Trennzeichen ausgerichtet" keine exakte Einrückung auf das von demselben PEP8 empfohlene Zeichen erhalten können. Das ist nur der Grund, Leerzeichen zu bevorzugen: um die Einrückung richtig zu machen!
user541905
1
Die Frage lautet: "Warum empfiehlt Python pep-8 zum Einrücken dringend Leerzeichen über Tabulatoren?" . Diese Antwort erwähnt nie etwas über das PEP8. ||| Anstatt zu versuchen, die Frage zu beantworten ... erscheint mir diese Antwort als ein riesiges herablassendes, in erster Linie meinungsbildendes Stück. Es werden 276 Wörter verwendet, um zu sagen "Tabulatoren sind besser als Leerzeichen und hier ist der Grund ...".
Trevor Boyd Smith
42

Ich persönlich bin mit Leerzeichen über Tabulatoren nicht einverstanden. Für mich sind Registerkarten ein Zeichen / Mechanismus für das Dokumentlayout, während Leerzeichen für den Inhalt oder die Abgrenzung zwischen Befehlen im Fall von Code dienen.

Ich muss Jims Kommentaren zustimmen, dass Tabs nicht wirklich das Problem sind, es sind Menschen und wie sie Tabs und Leerzeichen mischen wollen.

Trotzdem habe ich mich gezwungen, Räume für Konventionen zu nutzen. Ich schätze Beständigkeit gegenüber persönlichen Vorlieben.

Soviut
quelle
3
Ich habe versucht, mich dazu zu zwingen, auch Leerzeichen zu verwenden, aber Editor-Registerkarten (zumindest Eclipse + PyDev) gewinnen, insbesondere wenn Sie die Option "Unsichtbare Zeichen anzeigen" aktivieren. Und ich kann Tabs einfach so einstellen, dass sie visuell 4, 8, 6 Leerzeichen enthalten. Zumindest in meinem Code schätze ich persönliche Vorlieben und halte mich an Leerzeichen, wenn dies die in der vorhandenen Codebasis festgelegte Konvention ist.
Daniel Sokolowski
2
Das ist in Ordnung, solange Sie nicht in einem Team programmieren. Sobald Sie in einem Team sind, vereinbaren Sie eine einzige Konvention und halten sich daran.
Soviut
1
@Soviut Das scheint mir meistens Wunschdenken zu sein. In allen Teams, in denen ich jemals war, lautete die offizielle Parteilinie "Räume nutzen". Die Realität war, dass praktisch jede Datei ein totales Durcheinander von Tabulatoren und Leerzeichen war, und selbst in Dateien, die konsistent nur Leerzeichen oder nur Tabulatoren verwendeten, war die Einrückung immer noch überall.
antred
Ja, aber das habe ich gemeint. Ein gewisser Konsens wird schließlich erreicht und durchgesetzt. Wie Sie sagten, ist es normalerweise "nur Leerzeichen verwenden".
Soviut
Dies ist der Hauptgrund, warum ich Tabs bevorzuge. Es ist nur sinnvoll, separate Zeichen für Layout und
Wortbegrenzung
31

Der Grund für Leerzeichen ist, dass Registerkarten optional sind. Leerzeichen sind der kleinste gemeinsame Nenner in der Interpunktion.

Jeder anständige Texteditor hat ein "Tabulatoren durch Leerzeichen ersetzen" und viele Leute benutzen dieses. Aber nicht immer.

Während einige Texteditoren möglicherweise eine Reihe von Leerzeichen durch eine Registerkarte ersetzen, ist dies sehr selten.

Fazit . Mit Leerzeichen kann man nichts falsch machen. Sie könnten mit Tabs falsch liegen. Verwenden Sie also keine Tabulatoren und verringern Sie das Fehlerrisiko.

S.Lott
quelle
15
Ich würde niemals schwören, etwas falsch zu machen, nur weil viele andere (Leute, Texteditoren usw.) es auch falsch machen. Im Jahr 2015 gehört ein Texteditor, der Tabs nicht gut handhabt, in den Mülleimer.
antred
2
"Mit Leerzeichen kann man nichts falsch machen. Mit Tabulatoren kann man etwas falsch machen." Ich habe festgestellt, dass dies zu 100% falsch ist. Nach meiner Erfahrung: "Mit Tabulatoren können Sie nichts falsch machen. Mit Leerzeichen können Sie etwas falsch machen" ... insbesondere beim Teilen von Code.
cmroanirgo
5
Also hat es endlich jemand gesagt: Verwenden Sie Leerzeichen, weil es der kleinste gemeinsame Nenner ist. Dieselbe Regel hat uns dazu gebracht, MBR-, BIOS- und Papierformulare in Regierungsbüros beizubehalten. Abgesehen davon, dass diese tatsächlich konzeptionelle Probleme haben, während Tabulatoren gegen Leerzeichen ein 100% dummes Benutzerproblem sind.
Milind R
1
Dies scheint mir ein Argumentum ad populum zu sein: ein trügerisches Argument, das zu dem Schluss kommt, dass ein Satz wahr ist, weil viele oder die meisten Menschen daran glauben. Da jeder Editor Tabulatoren durch Leerzeichen ersetzen kann, sind Leerzeichen die richtige Wahl, ein Trugschluss !!
Djunzu
27

Das Problem mit Registerkarten ist, dass sie unsichtbar sind und sich die Anzahl der Registerkarten niemals einigen kann. Wenn Sie Tabulatoren und Leerzeichen mischen und Tabstops auf etwas anderes als Python setzen (das alle 8 Leerzeichen Tabstops verwendet), wird der Code in einem anderen Layout angezeigt als Python. Und weil das Layout Blöcke bestimmt, sehen Sie eine andere Logik. Es führt zu subtilen Fehlern.

Wenn Sie darauf bestehen, PEP 8 zu trotzen und Tabulatoren zu verwenden - oder schlimmer noch Tabulatoren und Leerzeichen zu mischen -, führen Sie Python zumindest immer mit dem Argument '-tt' aus, wodurch ein inkonsistenter Einzug entsteht (manchmal ein Tabulator, manchmal ein Leerzeichen für denselben Einzug Ebene) ein Fehler. Stellen Sie Ihren Editor nach Möglichkeit so ein, dass Registerkarten anders angezeigt werden. Aber wirklich, der beste Ansatz ist, keine Tabulatoren zu verwenden, Punkt.

Thomas Wouters
quelle
43
Es ist wahr, dass Registerkarten unsichtbar sind und die Benutzer sich nicht auf die Breite der Registerkarten einigen können. Gleiches gilt aber auch für Räume. Wenn Sie Tabulatoren und Leerzeichen mischen, geht etwas schief. Aber warum beschuldigen Sie Tabulatoren und nicht Leerzeichen für diese Situation?
Jim
47
Nein, das gilt nicht für Leerzeichen. Menschen können sich auf die Breite der Räume einigen.
Rafał Dowgird
32
Ein einzelnes Leerzeichen kann immer dieselbe Breite haben, aber Einrückungen mit Leerzeichen haben nicht immer dieselbe Breite. Ich verstehe nicht, wie sich die Zustimmung zur Verwendung von Tabulatoren mit einer Breite von n Leerzeichen von der Zustimmung zur Einrückung mit n Leerzeichen unterscheidet.
Jim
26
Ja, ich weiß, welche Probleme das Mischen der beiden verursachen kann. Was ich nicht verstehe, ist, warum manche Leute Tabs dafür verantwortlich machen. Das Problem ist, sie zu mischen, nicht insbesondere Tabs. Sie können das Problem lösen, indem Sie Tabulatoren durch Leerzeichen ersetzen. Sie können das Problem jedoch auch lösen, indem Sie Leerzeichen durch Tabulatoren ersetzen.
Jim
70
Und nein, wenn ich 8-breite Registerkarten verwende und Sie 6-breite Registerkarten verwenden und wir Code gemeinsam nutzen, wird dies nicht durcheinander gebracht. Für den Python-Interpreter ist alles nur eine einzige Registerkarte.
Jim
22

Die Hauptprobleme beim Einrücken treten auf, wenn Sie Tabulatoren und Leerzeichen mischen. Dies sagt Ihnen natürlich nicht, welche Sie wählen sollten, aber es ist ein guter Grund, eine zu empfehlen, selbst wenn Sie sie durch Umwerfen einer Münze auswählen.

Meiner Meinung nach gibt es jedoch einige kleinere Gründe, Leerzeichen gegenüber Tabulatoren zu bevorzugen:

  • Verschiedene Werkzeuge. Manchmal wird Code außerhalb des Editors eines Programmierers angezeigt. Z.B. in einer Newsgroup oder einem Forum gepostet. Leerzeichen sind hier im Allgemeinen besser als Tabulatoren - überall, wo Leerzeichen verstümmelt werden, tun dies auch Tabulatoren, aber nicht umgekehrt.

  • Programmierer sehen die Quelle anders. Dies ist zutiefst subjektiv - es ist entweder der Hauptvorteil von Registerkarten oder ein Grund, sie zu vermeiden, je nachdem, auf welcher Seite Sie sich befinden. Auf der positiven Seite können Entwickler die Quelle mit ihrem bevorzugten Einzug anzeigen, sodass ein Entwickler, der einen Einzug mit 2 Leerzeichen bevorzugt, mit einem Entwickler mit 8 Leerzeichen an derselben Quelle arbeiten und sie trotzdem so sehen kann, wie sie möchten. Der Nachteil ist, dass dies Auswirkungen hat - einige Leute mögen 8-Leerzeichen, weil es sehr sichtbares Feedback gibt, dass sie zu tief verschachtelt sind -, dass sie möglicherweise Code sehen, der vom 2-Indenter eingecheckt wird, der ständig in ihrem Editor eingeschlossen ist. Wenn jeder Entwickler den Code auf die gleiche Weise sieht, führt dies zu mehr Konsistenz bei den Zeilenlängen und anderen Aspekten.

  • Fortsetzung Zeileneinzug. Manchmal möchten Sie eine Zeile einrücken, um anzuzeigen, dass sie von der vorherigen übernommen wurde. z.B.

    def foo():
        x = some_function_with_lots_of_args(foo, bar, baz,
                                            xyzzy, blah)

    Wenn Sie Tabulatoren verwenden, können Sie dies nicht für Personen ausrichten, die in ihrem Editor unterschiedliche Tabstops verwenden, ohne Leerzeichen und Tabulatoren zu mischen. Dies macht den oben genannten Vorteil effektiv zunichte.

Offensichtlich ist dies jedoch ein zutiefst religiöses Thema, mit dem die Programmierung zu kämpfen hat. Das wichtigste Problem ist, dass wir eines auswählen sollten - auch wenn dies nicht das ist, das Sie bevorzugen. Manchmal denke ich, dass der größte Vorteil einer signifikanten Einrückung darin besteht, dass wir zumindest von Flamewars zur Platzierung von Zahnspangen verschont bleiben.

Ebenfalls lesenswert ist dieser Artikel von Jamie Zawinski zu diesem Thema.

Brian
quelle
3
Die Ausrichtung ist jedoch trivial. Ich benutze die Klammern einfach wie einen Block und rücke jedes Argument ein. In Ihrem Beispiel können Sie außerdem sehr gut Leerzeichen verwenden, da Sie sich in einer Argumentliste befinden und so viele Leerzeichen darin stapeln können, wie Sie möchten.
Soviut
3
@Soviut: Wenn Sie Leerzeichen einrücken, wird die Ausrichtung durcheinander gebracht, sobald sie mit einer anderen Tabulatorgröße angezeigt wird. Die einzige Möglichkeit, es beizubehalten, besteht darin, Tabulatoren bis zur Einrückungsebene und dann Leerzeichen für den Rest zu verwenden - dh Leerzeichen und Tabulatoren zu mischen, was zu eigenen Problemen führt.
Brian
Ja, weshalb ich sowieso eher die Python-Konvention des Blockeinrückens für meine Argumente verwende. Sicher, sie richten sich möglicherweise nicht mit der offenen Klammer aus, aber es ist immer noch klar, zu welcher Linie oder welchem ​​Befehl sie gehören. Die JQuery-Syntax arbeitet nach einem ähnlichen Prinzip.
Soviut
2
@ Brian: Ich sehe nicht, wie das zu Problemen führt. Es ist genau der richtige Weg, Registerkarten zum Einrücken, Leerzeichen zum Ausrichten. Es ist überhaupt nicht dasselbe wie das Mischen von Leerzeichen und Tabulatoren zum Einrücken .
antred
1
@CoreDumpError Äh nein, das tut es bestimmt nicht. Ich weiß das, weil Python 3 sich nie über eines meiner Skripte beschwert und ich Tabulatoren für Einrückungen / Leerzeichen verwende, um die ganze verdammte Zeit auszurichten. Außerdem kann PEP8 nichts "verbieten", da es lediglich eine Empfehlung ist (und meiner Meinung nach eine hirnrissige).
antred
12

Beachten Sie, dass die Verwendung von Registerkarten einen anderen Aspekt von PEP 8 verwirrt:

Begrenzen Sie alle Zeilen auf maximal 79 Zeichen.

Angenommen, Sie verwenden eine Tabulatorbreite von 2 und ich verwende eine Tabulatorbreite von 8. Sie schreiben Ihren gesamten Code so, dass Ihre längsten Zeilen 79 Zeichen erreichen, und dann beginne ich mit der Arbeit an Ihrer Datei. Jetzt habe ich schwer lesbaren Code, weil (wie im PEP angegeben):

Die Standardumhüllung in den meisten Tools stört die visuelle Struktur des Codes

Wenn wir alle 4 Leerzeichen verwenden, ist es IMMER das gleiche. Jeder, dessen Editor eine Breite von 80 Zeichen unterstützt, kann den Code bequem lesen. Hinweis: Die Beschränkung auf 80 Zeichen ist an und für sich ein heiliger Krieg. Beginnen wir hier also nicht.

Jeder nicht blöde Editor sollte die Option haben, Leerzeichen so zu verwenden, als wären sie Tabulatoren (sowohl Einfügen als auch Löschen), damit dies wirklich kein gültiges Argument sein sollte.

Thane Brimhall
quelle
7

Die Antwort auf die Frage lautet: PEP-8 möchte eine Empfehlung aussprechen und hat entschieden, dass Leerzeichen über Tabulatoren dringend empfohlen werden, da Leerzeichen beliebter sind.


Hinweise zu PEP-8

In PEP-8 heißt es: "Verwenden Sie 4 Leerzeichen pro Einrückungsstufe."
Es ist klar, dass dies die Standardempfehlung ist.

"Für wirklich alten Code, den Sie nicht durcheinander bringen möchten, können Sie weiterhin Tabulatoren mit 8 Leerzeichen verwenden."
Es ist klar, dass es einige Umstände gibt, unter denen Registerkarten verwendet werden können.

"Mischen Sie niemals Tabulatoren und Leerzeichen."
Dies ist ein klares Verbot des Mischens - ich denke, wir sind uns alle einig. Python kann dies erkennen und erstickt häufig. Die Verwendung des Arguments -tt macht dies zu einem expliziten Fehler.

'Die beliebteste Art, Python einzurücken, ist die Verwendung von Leerzeichen. Der zweitbeliebteste Weg ist nur mit Registerkarten. '
Dies zeigt deutlich, dass beide verwendet werden. Nur um ganz klar zu sein: Sie sollten niemals Leerzeichen und Tabulatoren in derselben Datei mischen.

"Für neue Projekte wird empfohlen, nur Leerzeichen über Registerkarten zu verwenden."
Dies ist eine klare und starke Empfehlung, aber kein Verbot von Tabs.


Ich kann in PEP-8 keine gute Antwort auf meine eigene Frage finden. Ich verwende Registerkarten, die ich historisch in anderen Sprachen verwendet habe. Python akzeptiert Quellen unter ausschließlicher Verwendung von Registerkarten. Das ist gut genug für mich.

Ich dachte, ich würde versuchen, mit Räumen zu arbeiten. In meinem Editor habe ich einen Dateityp so konfiguriert, dass ausschließlich Leerzeichen verwendet werden. Wenn ich die Tabulatortaste drücke, werden 4 Leerzeichen eingefügt. Wenn ich zu oft die Tabulatortaste drücke, muss ich die Leerzeichen löschen! Arrgh! Viermal so viele Löschungen wie Tabs! Mein Editor kann nicht sagen, dass ich 4 Leerzeichen für Einrückungen verwende (obwohl ein AN-Editor dies möglicherweise kann) und besteht offensichtlich darauf, die Leerzeichen einzeln zu löschen.

Könnte Python nicht angewiesen werden, Tabulatoren beim Lesen von Einrückungen als n Leerzeichen zu betrachten? Wenn wir uns auf 4 Leerzeichen pro Einzug und 4 Leerzeichen pro Tab einigen und Python erlauben könnten, dies zu akzeptieren, gäbe es keine Probleme.
Wir sollten Win-Win-Lösungen für Probleme finden.

Quamrana
quelle
1
Welchen Editor verwenden Sie? Die meisten, die ich verwendet habe, haben die Option, die Rücktaste zu dedentieren (Emacs verhält sich beispielsweise so), unabhängig von der Implementierung des Einrückens.
Brian
Sie haben Recht - ich sehe keine Option zum Dedentieren auf der Rücktaste, aber Sie können wahrscheinlich mit der Umschalttaste damit umgehen oder stattdessen den Einzug reduzieren (standardmäßig Strg-Umschalt-i standardmäßig).
Brian
Ich versuche nur PyScripter, das viel besser darin zu sein scheint, Leerzeichen zu verwenden, wenn Sie die Tabulatortaste drücken, und sie in 4 zu entfernen, wenn Sie die Rücktaste drücken.
Quamrana
28
"Ich muss die Leerzeichen löschen! Arrgh! Viermal so viele Löschungen wie Tabulatoren!" - Dies ist der einzige Grund, warum ich Tabulatoren für alles verwende und warum ich Leute, die Leerzeichen verwenden, für verrückt halte. :) Ich hatte noch nie Probleme, außer wenn ich etwas aus dem Web einfüge, das Leerzeichen verwendet. Dann behebt ein einfacher Find-Replace das.
Aphex
3

Ich habe in meinem Code immer Tabulatoren verwendet. Trotzdem habe ich kürzlich einen Grund gefunden, Leerzeichen zu verwenden: Bei der Entwicklung auf meinem Nokia N900 Internet-Tablet hatte ich jetzt eine Tastatur ohne Tabulatortaste. Dies zwang mich, entweder Registerkarten zu kopieren und einzufügen oder meinen Code mit Leerzeichen neu zu schreiben. Ich habe das gleiche Problem mit anderen Handys. Zugegeben, dies ist keine Standardanwendung von Python, aber etwas, das Sie beachten sollten.

Skyler
quelle
2

JWZ sagt es am besten :

Wenn [Leute] Code lesen und wenn sie mit dem Schreiben von neuem Code fertig sind, kümmern sie sich darum, wie viele Bildschirmspalten, um die der Code zum Einrücken neigt, wenn ein neuer Bereich (oder sexpr oder was auch immer) geöffnet wird ...

... Meiner Meinung nach besteht der beste Weg zur Lösung der technischen Probleme darin, dass das ASCII # 9-TAB-Zeichen niemals in Datenträgerdateien angezeigt wird: Programmieren Sie Ihren Editor so, dass TABs auf eine angemessene Anzahl von Leerzeichen erweitert werden, bevor Sie die Zeilen auf den Datenträger schreiben. ..

... Dies setzt voraus, dass Sie niemals Registerkarten an Stellen verwenden, an denen sie tatsächlich von Bedeutung sind, wie z. B. in Zeichenfolgen- oder Zeichenkonstanten, aber das mache ich nie: Wenn es darauf ankommt, dass es sich um eine Registerkarte handelt, verwende ich stattdessen immer '\ t'.

Mark Cidade
quelle
10
Ich würde das Gegenteil tun: Tabulatoren haben eine semantische Bedeutung für Einrückungen, daher ist es sinnvoller, Tabulatoren zu speichern und Leerzeichen anzuzeigen. Der Benutzer könnte einen Formatierungsstil wählen und der Editor würde die Registerkarten entsprechend erweitern.
AkiRoss
1
Sie haben immer noch das Problem gemischter Tabulatoren und Leerzeichen sowie eines Autors, der 1 Spalte pro Tabulator verwendet und mehr als 4 Mal einrückt, was in einem Texteditor so verrückt aussehen würde, dass jedes Tabulatorzeichen als 4 Spalten breit angezeigt wird. Registerkarten zum Einrücken sind in einem Texteditor mit variabler Breite am sinnvollsten, z. B. in einem Textverarbeitungsprogramm mit Schriftarten mit proportionalem Abstand. Nicht so sehr mit einem Texteditor mit fester Breite.
Mark Cidade
2
Nein, ich meinte, dass ein Texteditor in der Lage sein sollte, die Sprachgrammatik zu analysieren und zu verstehen, wann eine Tabellierung auftritt, damit Tabulatoren nur als Formatierungsmittel verwendet werden können und keine Leerzeichen zum Einrücken verwendet werden müssen. "tab" muss keine feste Breite haben, und ich finde es im Allgemeinen beschämend, dass bei heutigen Techniken (z. B. maschinelles Lernen) die Formatierung für Programmierer immer noch ein Problem darstellt. Alles sollte automatisiert und automatisiert und transparent sein.
AkiRoss
Ich sehe nicht ein, wie es das verstehen könnte.
Mark Cidade
1

Da Python zum Erkennen der Programmstruktur auf Einrückungen angewiesen ist, ist eine eindeutige Methode zur Identifizierung der Identifizierung erforderlich. Dies ist der Grund, entweder Leerzeichen oder Tabulatoren auszuwählen.

Python hat jedoch auch eine starke Philosophie, nur eine Möglichkeit zu haben, Dinge zu tun. Daher sollte es eine offizielle Empfehlung für eine Möglichkeit geben, Einrückungen vorzunehmen.

Sowohl Leerzeichen als auch Tabulatoren stellen einen Editor vor einzigartige Herausforderungen, die er als Einrückung behandeln kann. Die Handhabung der Registerkarten selbst ist nicht über Editoren oder Benutzereinstellungen hinweg einheitlich. Da Räume nicht konfigurierbar sind, stellen sie die logischere Wahl dar, da sie garantieren, dass das Ergebnis überall gleich aussieht.

Florian Bösch
quelle
8
Und da jeder Editor auch sein Farbschema auswählen kann, sollten Sie Ihrer Meinung nach auch festlegen, welches Farbschema verwendet werden soll?
o0 '.
8
Ja, aber macht diese Inkonsistenz nicht tatsächlich mehr Sinn? Weil es einfach eine Frage der visuellen Präferenz ist. Wenn ich einen größeren "aussehenden" Einzug in meinem Editor bevorzuge, kann ich meine Tabulatoren auf 8 Leerzeichen setzen, wenn ich weniger bevorzuge, kann ich sie auf 2 setzen. Auf diese Weise passt der Code, ohne die Formatierung tatsächlich zu ändern, besser zu der Person, die es ist beobachte es.
Dennmat
8
Ich stimme dennmat zu. Wenn ich 2 Leerzeichen visuell bevorzuge und Guido 4 Leerzeichen visuell bevorzugt, besteht die logische Wahl darin, Tabulatoreinrückungen zu verwenden.
Sepero
0

Der wichtigste Vorteil, den ich von Leerzeichen gegenüber Tabulatoren erkennen kann, besteht darin, dass viele Programmierer und Projekte eine festgelegte Anzahl von Spalten für den Quellcode verwenden. Wenn jemand eine Änderung festhält, deren Tabstop auf 2 Leerzeichen festgelegt ist und das Projekt 4 Leerzeichen als verwendet Der Tabstop der langen Zeilen wird für das Editorfenster anderer Leute zu lang. Ich stimme zu, dass das Arbeiten mit Registerkarten einfacher ist, aber ich denke, dass Leerzeichen für die Zusammenarbeit einfacher sind, was bei einem großen Open Source-Projekt wie Python wichtig ist.

Sirwart
quelle
2
Dies ist falsch: Dies geschieht nur, wenn Sie Tabulatoren und Leerzeichen mischen, und Sie würden es gleichermaßen lösen, indem Sie alle dazu zwingen, Tabulatoren anstelle von Leerzeichen zu verwenden.
o0 '.
0

Sie können Ihren Kuchen haben und ihn essen. Stellen Sie Ihren Editor so ein, dass Tabulatoren automatisch in Leerzeichen erweitert werden.

(Das wäre :set expandtabin Vim.)

Rod Daunoravicius
quelle
0

Ich vermute, dass die meisten Linux-Texteditoren die Standardeinstellungen standardmäßig lächerlich groß erscheinen lassen. Ich kann mir keinen anderen guten Grund vorstellen, Leerzeichen über Tabulatoren zu verwenden.

Brian Cronrath
quelle
-1

Neben all den anderen bereits genannten Gründen (Konsistenz, niemals Leerzeichen und Tabulatoren mischen usw.) gibt es meines Erachtens noch einige weitere Gründe für die 4-Leerzeichen-Konvention. Diese gelten nur für Python (und möglicherweise auch für andere Sprachen, in denen Einrückungen eine Bedeutung haben). Tabs können in anderen Sprachen je nach individuellen Vorlieben besser sein.

  1. Wenn in einem Editor keine Registerkarten angezeigt werden (was je nach Konfiguration in einigen Fällen der Fall ist), geht ein anderer Autor möglicherweise davon aus, dass Ihr Code 4 Leerzeichen verwendet, da fast der gesamte öffentlich verfügbare Python-Code dies tut. Wenn derselbe Editor zufällig eine Tabulatorbreite von 4 hat, können schlimme Dinge passieren - zumindest verliert diese arme Person Zeit wegen eines Einrückungsproblems, das durch das Festhalten an der Konvention sehr leicht zu vermeiden gewesen wäre. Für mich ist der Hauptgrund, Fehler mit Konsistenz zu vermeiden.

  2. Wenn man die Frage aktualisiert, welche Tabulatoren oder Leerzeichen besser sind, sollte man sich fragen, welche Vorteile Tabulatoren haben. Ich habe viele Posts gesehen, in denen Tabs gelobt wurden, aber nur wenige überzeugende Argumente dafür. Gute Editoren wie emacs, vi (m), kate, ... setzen je nach Semantik Ihres Codes die richtigen Einrückungen ein - auch ohne Tabulatoren. Dieselben Editoren können einfach so konfiguriert werden, dass sie auf der Rücktaste usw. nicht eingerückt werden.

  3. Einige Leute haben sehr starke Vorlieben, wenn es um ihre Freiheit bei der Entscheidung über das Aussehen / Layout von Code geht. andere legen Wert auf Beständigkeit gegenüber dieser Freiheit. Python reduziert diese Freiheit drastisch, indem diktiert wird, dass Einrückungen für Blöcke usw. verwendet werden. Dies kann als Fehler oder Feature angesehen werden, ist jedoch mit der Auswahl von Python verbunden. Persönlich mag ich diese Konsistenz - wenn ich anfange, ein neues Projekt zu programmieren, entspricht zumindest das Layout dem, was ich gewohnt bin, sodass es ziemlich einfach zu lesen ist. Fast immer.

  4. Die Verwendung von Leerzeichen zum Einrücken ermöglicht "Layout-Tricks", die das Verstehen von Code erleichtern können. Einige Beispiele hierfür sind in PEP8 aufgeführt. z.B.

    foo = long_function_name(var_one, var_two,
                             var_three, var_four)
    
    # the same for lists
    a_long_list = [1,
                   2,
                   # ...
                   79]
    
    # or dictionaries
    a_dict = {"a_key": "a_value",
              "another_key": "another_value"}

    Natürlich kann das obige auch schön geschrieben werden als

    foo = long_function_name(
        var_one, var_two,
        var_three, var_four)
    
    # the same for lists
    a_long_list = [
        1,
        2,
        # ...
        79]
    
    # or dictionaries
    a_dict = {
        "a_key": "a_value",
        "another_key": "another_value"}

    Letzteres benötigt jedoch mehr Codezeilen und weniger Zeilen werden manchmal als besser angesehen (b / c erhalten Sie mehr auf einem einzigen Bildschirm). Wenn Sie jedoch die Ausrichtung mögen, bieten Leerzeichen (vorzugsweise unterstützt von einem guten Editor) in gewisser Weise mehr Freiheit in Python als Tabulatoren. [Nun, ich denke, einige Editoren erlauben es Ihnen, dasselbe mit Tabulatoren zu tun;) - aber mit Leerzeichen tun es alle ...]

  5. Zurück zu demselben Argument, das alle anderen vorbringen - PEP 8 diktiert (ok, empfiehlt dringend) Leerzeichen. Wenn Sie zu einem Projekt kommen, das nur Registerkarten verwendet, haben Sie natürlich keine andere Wahl. Aufgrund der Einführung der PEP 8-Konventionen sind jedoch fast alle Python-Programmierer an diesen Stil gewöhnt. Dies macht es sooooo viel einfacher, einen Konsens über einen Stil zu finden, der von den meisten Programmierern akzeptiert wird ... und es könnte ansonsten sehr schwierig sein, wenn sich Einzelpersonen auf den Stil einigen.

  6. Tools, die bei der Durchsetzung des Stils helfen, kennen PEP 8 normalerweise ohne zusätzlichen Aufwand. Das ist kein guter Grund, aber es ist einfach schön, dass die Dinge sofort funktionieren.

Gerald Senarclens de Grancy
quelle
-3

Das universelle Problem bei Registerkarten besteht darin, dass sie in verschiedenen Umgebungen unterschiedlich dargestellt werden können.
In einem bestimmten Editor kann eine Registerkarte 8 Leerzeichen oder 2 sein.
In einigen Editoren können Sie dies steuern, in anderen nicht.

Ein weiteres Problem bei Registerkarten ist die Darstellung in der Druckausgabe. Ich glaube, die meisten Drucker interpretieren eine Registerkarte als 8 Leerzeichen.

Bei Leerzeichen besteht kein Zweifel. Alles wird so ausgerichtet sein, wie es der Autor beabsichtigt hat.

Benoit
quelle
14
Ein anderer, der die Registerkarte grundlegend missverstanden hat ... besorgen Sie sich eine mechanische Schreibmaschine und spielen Sie wirklich eine Weile damit! 1 Tab entspricht nicht 8 Leerzeichen! es ist gleich up_to_8_spaces ! otoh: Bei proportionalen Schriftarten sind Registerkarten die einzige Möglichkeit, die Ausrichtung zu gewährleisten.
3
"In einem bestimmten Editor kann eine Registerkarte 8 Leerzeichen oder 2 sein." Wenn ich 4-Leerzeichen mag und mein Freund 8-Leerzeichen oder 2-Leerzeichen oder 3-Leerzeichen oder usw. mag, können wir uns beide auf Registerkarten einigen, da der Editor (als dedizierte Einrückungszeichen ) weiß, was sie sind, und sie anzeigen kann entsprechend. Ich sehe den Code mit 4 Leerzeichen breiten Einrückungen, Sie sehen ihn mit 8 Leerzeichen breiten Einrückungen, unser seltsamer Freund verwendet seine 3 Leerzeichen und alles ist cool. Die Umstände (besonders in Python!), Unter denen die Tab-Breite selbst jemals eine Rolle spielen würde, sind so selten, dass selbst Space-Befürworter sie selten ansprechen.
JamesTheAwesomeDude
-4

Zur Diskussion zwischen Jim und Thomas Wouters in den Kommentaren.

Das Problem war ... da die Breite von Tabulatoren und Leerzeichen variieren kann - und da sich Programmierer auf keine der beiden Breiten einigen können - warum tragen Tabulatoren die Schuld.

Ich stimme Jim darin zu - Tabs sind an und für sich NICHT böse. Aber es gibt ein Problem...

Mit Leerzeichen kann ich steuern, wie "MEIN EIGENER CODE" in JEDEM Editor der Welt aussieht. Wenn ich 4 Leerzeichen verwende - egal in welchem ​​Editor Sie meinen Code öffnen, hat er den gleichen Abstand vom linken Rand. Mit Registerkarten bin ich der Einstellung der Registerkartenbreite für den Editor ausgeliefert - auch für MEINEN EIGENEN CODE. Und das gefällt mir nicht.

Es stimmt zwar, dass selbst Leerzeichen keine Konsistenz garantieren können - sie bieten Ihnen zumindest überall mehr Kontrolle über das Aussehen Ihres EIGENEN Codes - etwas, das Tabs nicht können.

Ich denke, es ist NICHT die Konsistenz in den Programmierern, die den Code schreiben - sondern die Konsistenz in den Editoren, die diesen Code zeigen -, dass Leerzeichen leichter zu erreichen (und aufzuerlegen) sind.

Baumkodierer
quelle
6
Sie sind der Einstellung der Registerkartenbreite für den Editor ausgeliefert? Wenn Ihr Editor nicht zulässt, dass Sie die gewünschte
Registerkartenbreite
4
@zigg Das ist für das Argument absolut irrelevant, da er (sie?) speziell über seinen / ihren eigenen Code spricht (diese Informationen sind sogar fett, kursiv und in Großbuchstaben). Nirgendwo in der Diskussion ist das Teilen von Code relevant.
user137369
1
Editoren sind nicht die einzigen Tools, mit denen Code angezeigt werden kann. Es gibt auch Unterschiede, Rückverfolgungen, Github und andere Webseiten usw., die alle eine Registerkartenbreite außerhalb Ihrer Kontrolle auswählen (wahrscheinlich 8).
RemcoGerlich
Ich weiß, worauf du hinauswillst. Sie steuern in der Tat, wie jeder Ihren Code sieht (in Bezug auf Einrückungen). Der nächste Schritt besteht darin, die Schriftart und -farbe zu steuern, mit der jeder Ihren Code sehen kann. Danach sind Sie bereit, die Welt selbst zu dominieren und nicht nur Code-Editoren !!
Djunzu