Python: Verwenden von 4 Leerzeichen zum Einrücken. Warum? [geschlossen]

74

Während ich Python codiere, verwende ich nur 2 Leerzeichen zum Einrücken. Sicher, PEP-8 empfiehlt wirklich 4 Leerzeichen, aber historisch gesehen ist das für mich ungewöhnlich.

Kann mich jemand überzeugen, 4 statt 2 Leerzeichen zu verwenden? Welche Vor- und Nachteile?

PS Und schließlich, wie kann man auf einfache Weise die gesamte vorhandene Codebasis von 2 Leerzeichen in 4 Leerzeichen konvertieren?


PPS PEP-8 Es wird außerdem dringend empfohlen, keine Registerkarten zum Einrücken zu verwenden. Lies hier


Um es zusammenzufassen:

Vorteile:

  • Haben Sie mehr Platz zum Anordnen, wenn Sie Zeichenfolgen mit einer Länge von mehr als 80 Zeilen umbrechen.
  • Kann Code aus Snippets kopieren und es funktioniert einfach.

Nachteile:

  • Mit einer tieferen Ebene verschachtelter Anweisungen haben Sie weniger Platz für tatsächlichen Code.

Vielen Dank.

HardQuestions
quelle
7
Du wirst dies zu einem Community-Wiki machen wollen, sonst wird es wahrscheinlich geschlossen. Dies ist ein höchst umstrittenes Thema, zu dem jeder seine eigene Meinung hat.
MitMaro
@MitMaro: Ich stimme zu, dass dies sehr subjektiv ist; obwohl es erwähnenswert ist, dass der PS-Teil eine gültige Frage ist.
DrAl
@AI: Sollte zwei getrennte Fragen gewesen sein
MitMaro
3
Es ist sehr subjektiv und Ansichtssache. Die richtige Meinung (;)) ist natürlich, dass jeder Tabulatoren verwenden sollte, damit er die Dinge mit den Einstellungen des Editors nach Belieben platzieren kann.
Quentin
18
Ich sehe überhaupt keinen Grund, diese Frage zu schließen. Er stellt eine legitime Programmierfrage, da Programme sowohl gelesen als auch geschrieben werden sollen. Und subjektiv zu sein macht es nicht weniger wichtig.
Daniel C. Sobral

Antworten:

125

Alle anderen benutzen 4 Felder. Dies ist der einzige Grund, 4 Leerzeichen zu verwenden, die ich gefunden und akzeptiert habe. In meinem Herzen möchte ich immer noch Tabulatoren verwenden (1 Einzug pro Einzug, macht Sinn, nein? Trennen Sie den Einzug von anderen Leerzeichen. Es ist mir egal, dass Tabulatoren in unterschiedlichen Breiten angezeigt werden können , was keinen syntaktischen Unterschied macht. Das Schlimmste Das kann passieren, dass einige der Kommentare nicht übereinstimmen. Der Horror!), aber ich habe akzeptiert, dass ich 4 Leerzeichen verwende, da die Python-Community insgesamt 4 Leerzeichen verwendet. Auf diese Weise kann ich Code aus Snippets zusammenstellen, die andere geschrieben haben, und alles funktioniert.

Markus
quelle
28
"Auf diese Weise kann ich Code aus Snippets zusammenstellen, die andere geschrieben haben, und alles funktioniert ..." UND es sieht aus und fühlt sich an wie mein Code :)
xtofl
17
Es gibt viele Leute zu diesem Thema, die behaupten, dass Registerkarten die einzig wahre Lösung sind, weil Sie sie auf eine beliebige Breite einstellen können. Das ist großartig, bis die Fortsetzungslinien aufgrund der neuen Art und Weise, wie Registerkarten angezeigt werden, überall gespreizt sind berechnet, oder Ihre rechten Ränder laufen über ... Ich habe mich im letzten Jahr mit einer Tonne davon in geerbtem Code in anderen Sprachen befasst, und es bringt mich dazu, die Zeit zu lieben, die ich damit verbringen muss, zu allgemein ziemlich einheitlich eingerückt zurückzukehren Python.
Zigg
2
Ich bin nicht mit Sublime Text verbunden (außer vor einiger Zeit eine Lizenz gekauft), aber ich finde es wirklich nützlich, benutzerdefinierte Einstellungen 'tab_size' = 4nur für Python und standardmäßig 'tab_size' = 2für andere Sprachen (wie JavaScript usw.) festzulegen.
Antony
2
Ich kann nicht mehr mit dir sein @Markus :) Den Status Quo zu akzeptieren, wenn der Unterschied am Ende ziemlich gering ist, ist das, was die Grenze zum Pedantischen zieht.
Micha Mazaheri
Verwenden Sie einen Editor, mit dem Sie Tabulatoren eingeben, aber 4 Leerzeichen ausgeben können. Ebene der Indirektion ftw
ahnbizcad
75

Ich mag die Tatsache, dass vier Leerzeichen den inneren Code einer Funktion gut einrücken, weil def + ein Leerzeichen vier Zeichen ergibt.

def·foo():
····pass
Ionuț G. Stan
quelle
23
Und ich mag die Tatsache, dass drei Leerzeichen den inneren Code einer ifAnweisung gut einrücken , weil if+ ein Leerzeichen drei Zeichen ergibt.
Alexander Shukaev
54

Ich denke, die eigentliche Frage ist, warum Leerzeichen und keine Tabulatoren.

Tabs sind eindeutig besser:

  • Es ist fast unmöglich, inkonsistente Einrückungen zu haben (ich habe Code gesehen, der normalerweise 4 Leerzeicheneinrückungen enthält, aber dann sind einige Teile zufällig ein Leerzeichen entfernt. Es ist schwierig, durch einfache Überprüfung festzustellen, ob 7 oder 8 Leerzeichen vorhanden sind ... würde mit Tabulatoren nicht passieren, es sei denn, Sie setzen Ihren Tabstop auf 1 Leerzeichen).
  • Tab ist eine logische semantische Darstellung für Einrückungen. Sie ermöglicht es Ihnen (und jedem anderen Entwickler), so viele "Leerzeichen" (oder vielmehr Spalten) anzuzeigen, wie Sie möchten, ohne die Vorlieben anderer Personen zu beeinträchtigen.
  • Es sind auch weniger Tastenanschläge, wenn Sie nur "Notepad" (oder einen anderen Dummy-Editor) zur Hand haben.
  • Das Hinzufügen und Entfernen von Registerkarten ist eine symmetrische Operation. Die meisten IDEs fügen beim Drücken der Tabulatortaste automatisch 4 Leerzeichen ein, entfernen jedoch normalerweise nur 1 Leerzeichen, wenn sie die Rücktaste drücken (der Vorgang zum Einrücken ohne Einzug ist weiterhin als Umschalttaste zugänglich, dies ist jedoch eine Kombination mit zwei Tasten), oder Sie verwenden die Maus zum Klicken in der Mitte des Einzugs und löschen Sie ein Zeichen.
  • Sie benötigen nur 1 Byte statt 4 (multiplizieren Sie mit Tausenden von Zeilen und Sie sparen ein paar KB !: P)
  • Sie haben eine Sache weniger, um eine Vereinbarung zu treffen, denn wenn Sie sich für Räume entscheiden, beginnt die Diskussion erneut mit der Auswahl der Anzahl (obwohl der Konsens bei vier zu liegen scheint).

Vorteile von Räumen:

  • Guido mag sie.
  • Sie können hier nicht einfach eine Registerkarte eingeben, sie überträgt den Fokus (obwohl Sie eine einfügen können).
fortran
quelle
2
Ich mag die Art und Weise, wie Sie sagten, dass es den Fokus überträgt.
Gibbs
17

Es gibt keine "bessere" Einrückung. Es ist ein religiöses Thema des Heiligen Krieges. Vier ist schön, weil es ausreicht, um die Einrückung deutlich zu machen, aber nicht so sehr, dass Ihr gesamter Bildschirm größtenteils aus Leerzeichen besteht und Sie horizontal scrollen müssen, um die Hälfte des Programms zu lesen.

Es hat auch den Vorteil, ein "halber Tab" ohne die historische Definition eines "Tabs" zu sein.

Verwenden Sie ansonsten alles, was Ihre Gruppe mag. Es ist wie Schokolade gegen Vanille.

Eine einfache Möglichkeit zum Wechseln ist die Verwendung eines Editors mit Unterstützung für Tabulatoren und Leerzeichen. Konvertieren Sie alle Ihre führenden Leerzeichen in Registerkarten, setzen Sie die Registerkartengröße auf vier und konvertieren Sie dann die führenden Registerkarten zurück in Leerzeichen.

Ziemlich einfach mit einem Python-Skript zu machen. Zählen Sie einfach alle führenden Leerzeichen, fügen Sie dann den gleichen Betrag am Zeilenanfang hinzu und schreiben Sie ihn wieder aus.

Christopher
quelle
Wir haben das gleiche in Emacs gemacht. Auf diese Weise konnten die Programmierer den von ihnen bevorzugten Abstand sehen, ohne ihn dem Rest der Gruppe aufzuzwingen.
Kelly S. French
14

Der PEP ist nicht der Boss von dir. Wenn es bereits konsistent mit 2 Leerzeichen eingerückt ist, gibt es keinen Grund, Ihren gesamten Code so zu ändern, dass er dem entspricht. Sie könnten es in Zukunft verfolgen, wenn Sie wirklich denken, dass es so wichtig ist, aber ehrlich gesagt, ich nicht. Sie sollten sich besser an die Konventionen halten, die Ihnen (und Ihren Mitarbeitern) den größten Komfort beim Lesen und Schreiben bieten.

Pesto
quelle
1
Einverstanden. Machen Sie Ihre eigene Konvention für Ihren Code. Ich benutze überall 2 Leerzeichen, egal welche Sprache es ist, also ist für mich mein gesamter Code konsistent. Nehmen Sie Richtlinien für den Alien-Code-Stil, z. B. PEP, mit einem Körnchen Salz und passen Sie sie an Ihre Bedürfnisse an. 4 Leerzeichen pro Einrückung sind dumme Verschwendung von horizontalem Leerzeichen, und diejenigen, die dies erfunden haben, sollten sich alle Monitore mit höchster Auflösung kaufen, wenn ihnen diese Konvention so gut gefällt.
Alexander Shukaev
7

Jeder anständige Redakteur (emacs, vim) wird diesen ganzen Unsinn für Sie abstrahieren. Es funktioniert genauso gut mit Leerzeichen oder Tabulatoren und kann so konfiguriert werden, dass eine beliebige Anzahl von Leerzeichen (oder eine beliebige Anzahl von Leerzeichenbreiten für ein Tabulatorzeichen) verwendet wird. Es kann auch ohne großen Aufwand zwischen den verschiedenen Formaten konvertieren (siehe :retabBefehl in vim).

Wenn Sie versuchen, die Quellformatierung in großen Mengen zu konvertieren, empfehlen wir Ihnen, sich das Dienstprogramm zum Einrücken anzusehen .

Trotzdem kann ich nicht widerstehen, die andere Frage zu beantworten ... Ich habe immer Tabs bevorzugt, da dies das gesamte Problem umgeht und jeder den Quellcode mit den eingestellten Breiten nach Belieben anzeigen kann. Es ist auch viel weniger tippen, wenn Sie in Editoren arbeiten, die beim Konvertieren nicht hilfreich sind. Was 2 gegen 4 Felder betrifft, ist das rein kosmetisch.

rmeador
quelle
6

Einer der Gründe ist auch: Wenn Sie eine lange Zeile (länger als 80 Symbole) haben und diese in zwei Teile teilen möchten, haben Sie nur 1 Leerzeichen zum Einrücken, was etwas verwirrend ist:

if code80symbolslong and somelongvariablegoeshere and somelongerthan80symbols \
 and someotherstatementhere:
  # some code inside if block
  pass

if code80symbolslong and somelongvariablegoeshere and somelongerthan80symbols \
  and someotherstatementhere:
    # some code inside if block
    pass
HardQuestions
quelle
7
Das solltest du nicht tun. Wenn Ihre Einrückung 4 Leerzeichen beträgt, sollten Sie niemals Einrückungen von weniger als dem haben. Meiner Meinung nach sollten die Zeilen "und" zwei Ebenen mehr eingerückt sein als die Zeile "wenn".
TimK
5

Wenn Sie der einzige Codierer sind, der an Ihrer Quelldatei arbeitet, und es keine Codierungsstandards gibt, die einen bestimmten Stil erzwingen, verwenden Sie alles, was Sie möchten. Persönlich (und in Übereinstimmung mit unserem Codierungsstandard) verwende ich harte Tabulatoren, damit jeder, der sich den Code ansieht, seine eigenen Vorlieben verwenden kann.

Um eine Änderung vorzunehmen, müssen Sie lediglich alle Zeilenanfangsbereiche in doppelt so große ändern. Es gibt viele Möglichkeiten, dies zu tun. Im Vim-Texteditor kann ich mir zwei vorstellen: Erstens:

:%s/^\(\s\{2}\)\+/\=repeat(' ', len(submatch(0))*2)

Dies ist ein einfacher regulärer Ausdruck, der am Anfang der Zeile nach einem oder mehreren Leerzeichenpaaren sucht und diese durch doppelt so viele Leerzeichen ersetzt, wie gefunden wurden. Es kann erweitert werden, um alle Dateien zu erstellen, indem Sie vim öffnen mit:

vim *.py

(oder das Äquivalent), gefolgt von (ungetestet):

:argdo %s/^\(\s\{2}\)\+/\=repeat(' ', len(submatch(0))*2)/ | w

Alternative:

" Switch to hard tabs:
:set noexpandtab
" Set the tab stop to the current setting
:set tabstop=2
" Change all spaces to tabs based on tabstop
:retab!
" Change the tab stop to the new setting
:set tabstop=4
" Go back to soft tabs
:set expandtab
" Replace all the tabs in the current file to spaces
:retab

Natürlich werden viele andere Werkzeuge ähnliche Funktionen bieten: ich überrascht würde , wenn so etwas wie sed, awk, perloder das pythonnicht sehr leicht tun könnte.

DrAl
quelle
3

Identifikations- und allgemeine Codierungsstilstandards variieren von Sprache zu Sprache, von Projekt zu Projekt. Es gibt einen Grund für die Übernahme eines Codierungsstilstandards: Damit der Code einheitlich aussieht, unabhängig davon, wer ihn geschrieben hat. Das verbessert die Lesbarkeit des Projekts und sieht, um es klar auszudrücken, besser aus.

Es gibt einen Grund, der bei der Übernahme eines Codierungsstilstandards nicht gültig ist: weil es Ihnen gefällt. Codierungsstandards existieren genau deshalb, weil die Vorlieben der Menschen unterschiedlich sind und wenn sie sich selbst überlassen würden, würde Chaos zum Nachteil aller entstehen.

Wenn Sie Code für sich selbst schreiben, den niemand jemals lesen wird, schreiben Sie ihn nach Belieben. Andernfalls wird das Befolgen des akzeptierten Standards Ihrer Community Ihren Code für die Augen aller anderen viel angenehmer machen. Und denken Sie auch daran, dass Sie es leichter haben, wenn Sie sich entscheiden, in Zukunft Code für eine Community bereitzustellen, wenn Sie bereits an deren Codierungsstil gewöhnt sind.

Was das Ändern der Registerkartengröße betrifft, gibt es viele Quellcode-Formatierer, die Python unterstützen, und die meisten Editoren und IDEs von Programmierern verfügen ebenfalls über diese Funktion. Sie haben es wahrscheinlich bereits, es ist nur eine Frage der Dokumentation des von Ihnen verwendeten Editors.

Daniel C. Sobral
quelle
1

Ein Grund dafür ist, dass Sie mehr Anweisungen verschachteln können, wenn Sie weniger Leerzeichen zum Einrücken verwenden (da die Zeilenlänge normalerweise auf 80 beschränkt ist).

Jetzt bin ich mir ziemlich sicher, dass einige Leute sich immer noch nicht darüber einig sind, wie viele verschachtelte Konstrukte das Maximum sein sollten.

Bastien Léonard
quelle
1

Es ist einfacher, lange verschachtelte Codeblöcke mit 4 Leerzeichen visuell zu identifizieren. Spart Zeit beim Debuggen.


quelle
Einverstanden. Für eine Sprache wie C würde ich eigentlich lieber zwei verwenden, aber in C ist der visuelle Hinweis durch Einrückung weniger wichtig als in Python.
user1071847
1

Wenn Sie Python-Code zusammen mit anderen Programmierern schreiben möchten, wird es zu einem Problem, wenn Sie eine andere Einrückung als diese verwenden. Die meisten Python-Programmierer verwenden normalerweise 4-Leerzeichen-Einrückungen.

Christian
quelle
0

Die Verwendung von 4 oder 2 Feldern liegt ganz bei Ihnen. 4 Plätze ist nur eine Konvention. Was am wichtigsten ist, mischen Sie keine Tabulatoren und Leerzeichen. Verwenden Sie die Leertaste

Ghostdog74
quelle