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.
python
indentation
Quamrana
quelle
quelle
Antworten:
Die Antwort wurde direkt in dem PEP gegeben [ed: diese Passage in herausgeschnitten wurde 2013 ]. Ich zitiere:
Welchen anderen Grund brauchen Sie?
Um es weniger klar auszudrücken: Berücksichtigen Sie auch den Umfang des PEP, wie im ersten Absatz angegeben:
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
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
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.
quelle
Beachten Sie, dass die Verwendung von Registerkarten einen anderen Aspekt von PEP 8 verwirrt:
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):
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.
quelle
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.
quelle
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.
quelle
JWZ sagt es am besten :
quelle
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.
quelle
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.
quelle
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 expandtab
in Vim.)quelle
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.
quelle
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.
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.
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.
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.
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.
Natürlich kann das obige auch schön geschrieben werden als
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 ...]
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.
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.
quelle
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.
quelle
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.
quelle