PEP 8, warum keine Leerzeichen um '=' im Schlüsselwortargument oder einem Standardparameterwert?

103

Warum empfiehlt PEP 8, keine Leerzeichen =in einem Schlüsselwortargument oder einem Standardparameterwert zu haben ?

Ist dies nicht mit der Empfehlung von Leerzeichen um jedes andere Vorkommen =in Python-Code vereinbar?

Wie ist:

func(1, 2, very_long_variable_name=another_very_long_variable_name)

besser als:

func(1, 2, very_long_variable_name = another_very_long_variable_name)

Alle Links zu Diskussionen / Erklärungen durch Pythons BDFL sind willkommen.

Beachten Sie, dass es bei dieser Frage mehr um kwargs als um Standardwerte geht. Ich habe nur die Formulierung aus PEP 8 verwendet.

Ich bitte nicht um Meinungen. Ich frage nach Gründen für diese Entscheidung. Es ist eher so, als würde man fragen, warum ich {in derselben Zeile wie die ifAnweisung in einem C-Programm verwenden soll, nicht, ob ich sie verwenden soll oder nicht.

Soulcheck
quelle

Antworten:

72

Ich denke, das liegt daran, dass sich ein Schlüsselwortargument wesentlich von einer Variablenzuweisung unterscheidet.

Zum Beispiel gibt es so viel Code:

kw1 = some_value
kw2 = some_value
kw3 = some_value
some_func(
    1,
    2,
    kw1=kw1,
    kw2=kw2,
    kw3=kw3)

Wie Sie sehen, ist es durchaus sinnvoll, einem genau gleichnamigen Schlüsselwortargument eine Variable zuzuweisen, um die Lesbarkeit zu verbessern und sie ohne Leerzeichen anzuzeigen. Es ist einfacher zu erkennen, dass wir Schlüsselwortargumente verwenden und sich selbst keine Variable zuweisen.

Außerdem gehen die Parameter in der Regel in dieselbe Zeile, während die Zuweisungen normalerweise jeweils in einer eigenen Zeile erfolgen. Daher ist es wahrscheinlich wichtig, dort Platz zu sparen.

fortran
quelle
6
Dies könnte der Fall sein, scheint aber dennoch seltsam, diese IMO-Symbolkonsistenz in Empfehlungen für den Codestil für eine so gut gestaltete Sprache einzuführen, nur um 2 Zeichen zu sparen. Es ist, als ob der Java-Code-Stil besagt, dass es wichtig ist, danach {eine neue Zeile einzufügen if(speichert die gleiche Anzahl von Zeichen), aber nicht in der Klassendefinition. Auch ein Schlüsselwortparameter unterscheidet sich vom Standardwert, verwendet jedoch immer noch dieselbe Stilempfehlung.
Soulcheck
3
Wie gesagt, das sind verschiedene Dinge. Es ist sinnvoll, sie anders zu schreiben.
Fortan
6
Ich würde sagen, es ist nicht wirklich lesbarer als kw1 = kw1, kw2 = kw2;), aber vielleicht dachten Guido und Barry das.
Soulcheck
1
Ich werde diese Antwort akzeptieren, da sie ziemlich überzeugend ist.
Ich
5
Die Tatsache, dass sich das Schlüsselwortargument grundlegend von der Variablenzuweisung unterscheidet, ist kein gültiges Argument für unterschiedliche IMO-Konventionen, da der Unterschied bereits aus dem Kontext hervorgeht. Ersteres geschieht innerhalb eines Funktionsaufrufs, und letzteres muss auf der aktuellen Einrückungsstufe allein stehen. IMO, für Variablennamen, die länger als 5-6 Zeichen sind (dh für die meisten im wirklichen Leben), ist die Variante mit Leerzeichen zweifellos besser lesbar.
Axel
13

Ich würde very_long_variable_name nicht als Standardargument verwenden. Bedenken Sie also Folgendes:

func(1, 2, axis='x', angle=90, size=450, name='foo bar')

darüber:

func(1, 2, axis = 'x', angle = 90, size = 450, name = 'foo bar')

Es ist auch wenig sinnvoll, Variablen als Standardwerte zu verwenden. Vielleicht einige konstante Variablen (die nicht wirklich Konstanten sind) und in diesem Fall würde ich Namen verwenden, die alle Großbuchstaben sind, beschreibend und doch so kurz wie möglich. Also kein anderer_sehr _...

rplnt
quelle
1
Das sind Schlüsselwortargumente. Ein ähnliches Beispiel ist in PEP. Ich habe es nur weniger lesbar gemacht
Soulcheck
3
Sie sagen (im Wesentlichen): Um die No-Space-Regel sinnvoll zu gestalten, schreiben Sie sehr kurze Variablennamen. Wenn man jedoch lange Variablennamen hat, sorgt die No-Space-Regel für eine überfüllte Umgebung. Das Argument, dass es sich nicht um eine Aufgabe handelt, es handelt sich also um verschiedene Dinge, ist für mich kein Problem, da mir die Lesbarkeit mehr am Herzen liegt als die Semantik und wenn es sich nicht um einen Standardwert für eine Aufgabe handelt, was dann? es?
PatrickT
1
@PatrickT Das Argument "Es ist keine Aufgabe, also sind es verschiedene Dinge" erklärt nicht, warum es so ist (ein philosophischer Begriff); Es erklärt lediglich, warum es sein kann (ein syntaktischer Begriff).
Mateen Ulhaq
11

Es gibt Vor- und Nachteile.

Ich mag es nicht, wie PEP8-kompatibler Code gelesen wird. Ich mag das Argument nicht, very_long_variable_name=another_very_long_variable_namedas jemals menschlicher lesbar sein kann als very_long_variable_name = another_very_long_variable_name. So lesen die Leute nicht. Dies ist eine zusätzliche kognitive Belastung, insbesondere wenn keine Syntaxhervorhebung erfolgt.

Es gibt jedoch einen signifikanten Vorteil. Wenn die Abstandsregeln eingehalten werden, wird die Suche nach Parametern ausschließlich mit Werkzeugen wesentlich effektiver.

Hywel Thomas
quelle
Wenn Sie Leerzeichen um = setzen, sollte die Suche mit Werkzeugen nicht anders sein.
NoName
10

IMO, das die Leerzeichen für Argumente weglässt, sorgt für eine sauberere visuelle Gruppierung der Argumente / Wert-Paare. es sieht weniger überladen aus.

JoeC
quelle
Ich mag Leerzeichen im Allgemeinen so sehr, dass ich Leerzeichen auch nur in Klammern setze, sodass alle Parameter von Leerzeichen umgeben sind. Aber ich denke, das arg1=40ist besser lesbar, da die Beziehung offensichtlicher ist.
Charlie Gorichanaz
3

Ich denke, es gibt mehrere Gründe dafür, obwohl ich vielleicht nur rationalisiere:

  1. Dies spart Platz, ermöglicht, dass mehr Funktionsdefinitionen und Aufrufe in eine Zeile passen, und spart mehr Platz für die Argumentnamen selbst.
  2. Durch Verbinden der einzelnen Schlüsselwörter und Werte können Sie die verschiedenen Argumente einfacher durch das Leerzeichen nach dem Komma trennen. Dies bedeutet, dass Sie schnell feststellen können, wie viele Argumente Sie geliefert haben.
  3. Die Syntax unterscheidet sich dann von Variablenzuweisungen, die denselben Namen haben können.
  4. Darüber hinaus unterscheidet sich die Syntax (noch mehr) von Gleichheitsprüfungen, a == bdie auch gültige Ausdrücke innerhalb eines Aufrufs sein können.
otus
quelle
3

Für mich macht es Code lesbarer und ist daher eine gute Konvention.

Ich denke, der wesentliche Unterschied in Bezug auf den Stil zwischen Variablenzuweisungen und Funktionsschlüsselwortzuweisungen besteht darin, dass =für die erstere nur eine einzige in einer Zeile stehen sollte, während =für die letztere im Allgemeinen mehrere s in einer Zeile stehen.

Wenn es keine anderen Überlegungen waren, würden wir es vorziehen foo = 42zu foo=42, weil dieser nicht, wie Gleichheitszeichen sind in der Regel formatiert ist , und weil die ehemalige schön trennt visuell die Variable und Wert mit Leerzeichen.

Aber wenn es mehrere Zuordnungen sind auf einer Linie, ziehen wir f(foo=42, bar=43, baz=44)an f(foo = 42, bar = 43, baz = 44), weil erstere visuell trennt die verschiedenen Zuordnungen mit Leerzeichen, während letzteres nicht der Fall ist, ist es ein bisschen schwerer zu machen , um zu sehen , wo die Schlüsselwort / Wert - Paare sind.

Hier ist eine andere Art, es auszudrücken: Es gibt eine Konsistenz hinter der Konvention. Diese Konsistenz ist folgende: Die "höchste Trennungsstufe" wird über Räume visuell klarer. Niedrigere Trennstufen sind dies nicht (da dies mit dem Leerzeichen verwechselt werden würde, das die höhere Stufe trennt). Bei der Variablenzuweisung liegt die höchste Trennungsstufe zwischen Variable und Wert. Bei der Zuweisung von Funktionsschlüsselwörtern liegt die höchste Trennungsstufe zwischen den einzelnen Zuweisungen selbst.

Denziloe
quelle