Bereich Nicht-Standardparameter folgt Standard-1

8

Warum lässt der Bereich einen nicht standardmäßigen Parameter ( stop ) zu folgen einem Standardparameter ( start )?

Fall in Punkt:

%Vor%

Der Versuch, die Signatur zu emulieren, ist ein offensichtlicher Verstoß:

%Vor%

Ich verstehe, dass die Tatsache, dass es in C implementiert ist, wahrscheinlich ein Verhalten erlaubt, das in Pythonland eine Verletzung wäre.

Ich nehme an, dass dies getan wurde, um die API benutzerfreundlicher zu machen, aber ich habe keine Quellen gefunden, die das unterstützen. (Der Quelltext sagt nicht viel und PEP 457 gibt nur an, wie range ungerade ist. Weiß jemand, warum das gemacht wurde?

    
Jim Fasarakis Hilliard 16.05.2017, 10:39
quelle

1 Antwort

6

Ich denke, die Frage basiert auf einer falschen Prämisse:

  

Ich verstehe, dass die Tatsache, dass es in C implementiert ist, wahrscheinlich ein Verhalten erlaubt, das in Pythonland eine Verletzung darstellen würde.

Es ist in C implementiert, aber das Verhalten ist keine Verletzung in "Pythonland". Die Signatur in der Dokumentation ist nur falsch (nicht wirklich falsch, es ist eine Annäherung an die "echte Signatur" - die leicht verstanden werden kann).

Zum Beispiel unterstützt range nicht einmal benannte Parameter - aber laut der Dokumentation sollte es:

%Vor%

Die Implementierung ist also eher wie folgt:

%Vor%

Das ist Python und (grob) macht das, was range intern tut (das tatsächliche Implementierung (CPython, Python 3.6.1) könnte etwas anders sein, also nimm diese Klasse nicht zu ernst).

Allerdings ist eine Signatur wie range(*args) wahrscheinlich nicht wirklich hilfreich für Benutzer (besonders neue Benutzer, die nicht einmal wissen, was *args bedeutet). Wenn eine Dokumentation mit range zwei Signaturen enthält: range(stop) und range(start, stop[, step]) ist möglicherweise nicht (technisch) korrekt, aber sie "erklärt", wie die Signatur interpretiert wird.

Was das warum angeht: Ich habe keine glaubwürdigen Quellen, aber ich habe meinen Code schnell gescannt:

Ich verwende range(stop) viel häufiger als range(start, stop) oder range(start, stop, step) . Also war der eine Argumentationsfall wahrscheinlich speziell und häufig genug , um eine Bequemlichkeit dafür zu haben. Es wäre ziemlich ärgerlich, immer range(0, stop) überall zu schreiben.

    
MSeifert 16.05.2017, 11:29
quelle