54 Stimmen

Python-Einrückung in "Leerzeilen"

Welches ist vorzuziehen ("." als Hinweis auf Leerzeichen)?

A)

def foo():
    x = 1
    y = 2
....
    if True:
        bar()

B)

def foo():
    x = 1
    y = 2

    if True:
        bar()

Meine Intuition wäre B (das ist auch das, was vim für mich tut), aber ich sehe ständig Leute, die A) benutzen. Ist es nur, weil die meisten der Editoren da draußen kaputt sind?

54voto

YOU Punkte 113320

Wenn Sie A können Sie Ihren Block in die Python-Shell kopieren und einfügen, B wird ein unerwarteter Einrückungsfehler auftreten.

0 Stimmen

Ich habe versucht, A in idlex zu verwenden und erhielt stattdessen einen ungültigen Syntaxfehler.

3 Stimmen

@obesechicken13 Diese Punkte sollen eigentlich Leerzeichen sein, sie sind nur gezeichnet, damit man weiß, dass sie da sind.

5 Stimmen

Wenn Sie IPython verwenden, sollten Sie mit der Option %paste stattdessen. Sie kann entweder A oder B bearbeiten.

28voto

Michael Aaron Safyan Punkte 90663

El PEP 8 scheint in dieser Frage nicht eindeutig zu sein, obwohl die Aussagen über "Leerzeilen" zugunsten von B interpretiert werden könnten. Der PEP 8 style-checker (pep8.py) bevorzugt B und warnt, wenn Sie A verwenden; beide Varianten sind jedoch legal. Ich bin der Meinung, dass dies keine Rolle spielt, da Python den Code in beiden Fällen erfolgreich interpretiert, und dass der Versuch, dies durchzusetzen, viel Arbeit für sehr wenig Gewinn bedeuten würde. Ich nehme an, wenn man sich sehr für das eine oder das andere entscheidet, könnte man das eine automatisch in das andere umwandeln. Der Versuch, alle diese Zeilen manuell zu korrigieren, wäre jedoch ein riesiges Unterfangen und die Mühe wirklich nicht wert, IMHO.

19 Stimmen

Es gibt gute Argumente für A - Kopieren in die Shell, B führt bei manchen Editoren zu Problemen. Solange es nicht auch Probleme mit A gibt, scheint es ein Fall von "A hilft in manchen Fällen, schadet in keinem" zu sein und daher sollte A verwendet werden.

1 Stimmen

s/^([\t ]+)([^\r\n]*)(\r?\n)\r?\n/\1\2\3\1\3/ . Suchen: Erfassen von Tabulatoren oder Leerzeichen am Zeilenanfang, Erfassen von Nicht-Neuzeilen-Zeichen (falls vorhanden), Erfassen von Neuzeilen, Suchen von Neuzeilen*. Ersetzen: Einrückung, Zeileninhalt, Neuzeilen, Einrückung, Neuzeilen. Achtung: Wenn die Einrückungszeile einen neuen Block eröffnet, erkennt die Regex dies nicht und setzt die nächste Zeile einfach auf die gleiche Einrückungsebene. *Ich ignoriere das zweite Zeilenumbruchformat und verwende einfach das vorherige Format, um die Konsistenz zu gewährleisten.

2 Stimmen

Der Pep8-Linter beschwert sich über A. W293 blank line contains whitespace Und viele andere Pythonzüchter tun dasselbe

24voto

Zags Punkte 30855

Leerzeilen richtig einrücken (Stil A in der Frage) verbessert die Lesbarkeit des Codes bei aktivierter Leerraumanzeige erheblich, da es leichter zu erkennen ist, ob der Code nach einer Leerzeile Teil desselben Einrückungsblocks ist oder nicht.

Bei einer Sprache wie Python, wo es keine Endanweisung oder schließende Klammer gibt, bin ich überrascht, dass dies nicht Teil des PEP ist. Es wird dringend empfohlen, Python mit aktiviertem Leerzeichen zu editieren, um sowohl Leerzeichen am Ende als auch eine gemischte Einrückung zu vermeiden.

Vergleichen Sie die Lektüre des Folgenden:

A)

def foo():
....x = 1
....y = 2
....
....if True:
........bar()

B)

def foo():
....x = 1
....y = 2

....if True:
........bar()

Unter A ist es viel deutlicher, dass die letzten beiden Zeilen Teil von foo . Dies ist bei höheren Einrückungsgraden sogar noch nützlicher.

1 Stimmen

Ich stimme dieser Antwort voll und ganz zu. Und außerdem ist das von Ihnen geschilderte Problem noch schlimmer, wenn man einen Code verstehen muss, der Tabulatoren mit zwei Leerzeichen verwendet!

14voto

T . Punkte 4754

Diese leere Zeile gehört zu foo() Ich würde also in Betracht ziehen A am natürlichsten zu sein. Aber das ist wohl reine Ansichtssache.

0 Stimmen

Ich stimme zu, dass es natürlicher ist, und ich stimme nicht zu, dass es eine Frage der Meinung ist. Es ist eine Tatsache.

6voto

o0'. Punkte 11502

TextMate unterbricht das Zusammenklappen von Blöcken, wenn Sie B verwenden, und ich bevorzuge ohnehin A, da es "logischer" ist.

1 Stimmen

Interessant. Ich habe es gerade mit EditPadPro ausprobiert, das auch die Einrückungsebene für die Codefaltung verwendet und leere Zeilen gut verarbeitet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X