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?
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:
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.
Tags und Links python python-3.x python-internals