Was bedeutet die /
bedeuten in Python 3.4 help
Ausgang für range
vor der schließenden Klammer?
>>> help(range)
Help on class range in module builtins:
class range(object)
| range(stop) -> range object
| range(start, stop[, step]) -> range object
|
| Return a virtual sequence of numbers from start to stop by step.
|
| Methods defined here:
|
| __contains__(self, key, /)
| Return key in self.
|
| __eq__(self, value, /)
| Return self==value.
...
Es bedeutet das Ende der nur positionell ParameterParameter Sie kann nicht als Schlüsselwortparameter verwenden. Vor Python 3.8 konnten solche Parameter nur in der C-API angegeben werden.
Es bedeutet die key
Argument zu __contains__
kann nur nach Position übergeben werden (range(5).__contains__(3)
), nicht als Schlüsselwortargument (range(5).__contains__(key=3)
), etwas Sie dürfen tun mit Positionsargumenten in reinen Python-Funktionen.
Siehe auch die Argument Klinik Dokumentation:
Um alle Parameter in Argument Clinic als Nur-Positions-Parameter zu markieren, fügen Sie a hinzu /
auf einer eigenen Zeile nach dem letzten Parameter, genauso eingerückt wie die Parameterzeilen.
und die (sehr neue Ergänzung zu) die Python-FAQ:
Ein Schrägstrich in der Argumentliste einer Funktion zeigt an, dass die Parameter davor nur positionell sind. Reine Positionsparameter sind diejenigen ohne einen extern verwendbaren Namen. Beim Aufrufen einer Funktion, die nur Positionsparameter akzeptiert, werden Argumente Parametern zugeordnet, die ausschließlich auf ihrer Position basieren.
Die Syntax ist jetzt Teil der Python-Sprachspezifikation, ab Version 3.8sehen PEP 570 – Nur-positionale Python-Parameter. Vor PEP 570 war die Syntax bereits für eine mögliche zukünftige Aufnahme in Python reserviert, siehe PEP 457 – Syntax für Nur-Positions-Parameter.
Nur-Positions-Parameter können zu saubereren und klareren APIs führen, reine Python-Implementierungen von ansonsten reinen C-Modulen konsistenter und einfacher zu warten machen, und da Nur-Positions-Parameter sehr wenig Verarbeitung erfordern, führen sie zu schnellerem Python-Code.
Diese Frage habe ich mir selbst gestellt. 🙂 Herausfinden, dass /
wurde ursprünglich von Guido in vorgeschlagen Hier.
Alternativvorschlag: wie wäre es mit “https://stackoverflow.com/” ? Es ist so etwas wie das Gegenteil von „*“, was „Schlüsselwortargument“ bedeutet, und „https://stackoverflow.com/“ ist kein neues Zeichen.
Dann sein Vorschlag gewonnen.
Heh. Wenn das stimmt, gewinnt mein “https://stackoverflow.com/”-Vorschlag:
def foo(pos_only, /, pos_or_kw, *, kw_only): ...
Ich denke, das sehr relevante Dokument, das dies abdeckt, ist PEP 570. Wo der Zusammenfassungsbereich gut aussieht.
Rekapitulieren
Der Anwendungsfall bestimmt, welche Parameter in der Funktionsdefinition verwendet werden:
def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2):
Als Anleitung:
Verwenden Sie positional-only, wenn Namen keine Rolle spielen oder keine Bedeutung haben und es nur wenige Argumente gibt, die immer in derselben Reihenfolge übergeben werden. Verwenden Sie nur Schlüsselwörter, wenn Namen eine Bedeutung haben und die Funktionsdefinition verständlicher ist, indem Sie Namen explizit angeben.
Wenn die Funktion mit endet /
def foo(p1, p2, /)
Das bedeutet, dass alle funktionalen Argumente positionell sind.
Schrägstrich (/) zeigt an, dass alle Argumente davor nur Positionsargumente sind. Die Funktion „Nur Positionsargumente“ wurde später in Python 3.8 hinzugefügt PEP 570 wurde akzeptiert. Ursprünglich wurde diese Notation in definiert PEP 457 – Notation for Notation For Positional-Only Parameters
Parameter in der Funktionsdefinition vor dem Vorwärts-Schrägstrich (/) sind nur positionell und Parameter, denen ein Schrägstrich (/) folgt, können je nach Syntax beliebig sein. Wobei Argumente rein positionellen Parametern zugeordnet werden, die ausschließlich auf ihrer Position beim Aufrufen einer Funktion basieren. Das Übergeben von Positionsparametern durch Schlüsselwörter (Name) ist ungültig.
Nehmen wir folgendes Beispiel
def foo(a, b, / , x, y):
print("positional ", a, b)
print("positional or keyword", x, y)
Hier in der obigen Funktionsdefinition sind die Parameter a und b nur positionell, während x oder y entweder eine Position oder ein Schlüsselwort sein kann.
Folgende Funktionsaufrufe sind gültig
foo(40, 20, 99, 39)
foo(40, 3.14, "hello", y="world")
foo(1.45, 3.14, x="hello", y="world")
Der folgende Funktionsaufruf ist jedoch nicht gültig, was eine Ausnahme TypeError auslöst, da a, b nicht als Positionsargumente, sondern als Schlüsselwort übergeben werden
foo(a=1.45, b=3.14, x=1, y=4)
TypeError: foo() hat einige Positionsargumente als Schlüsselwortargumente übergeben: ‘a, b’
Viele in Python eingebaute Funktionen akzeptieren nur Positionsargumente, bei denen das Übergeben von Argumenten nach Schlüsselwörtern keinen Sinn macht. Zum Beispiel eingebaute Funktion len akzeptiert nur ein positionelles (nur) Argument. Wenn der Aufruf von len als len(obj=”hello world”) die Lesbarkeit beeinträchtigt, überprüfen Sie help(len).
>>> help(len)
Help on built-in function len in module builtins:
len(obj, /)
Return the number of items in a container.
Nur Positionsparameter machen die zugrunde liegenden c/library-Funktionen einfach zu warten. Es ermöglicht, dass Parameternamen von Positionsparametern in Zukunft geändert werden können, ohne dass das Risiko besteht, dass der Client-Code, der die API verwendet, beschädigt wird
Last but not least erlauben es uns Positionsparameter, ihre Namen in Schlüsselwortargumenten mit variabler Länge zu verwenden. Überprüfen Sie das folgende Beispiel
>>> def f(a, b, /, **kwargs):
... print(a, b, kwargs)
...
>>> f(10, 20, a=1, b=2, c=3) # a and b are used in two ways
10 20 {'a': 1, 'b': 2, 'c': 3}
Die Syntax nur für Positionsparameter wurde offiziell zu Python3.8 hinzugefügt. Kasse was ist neu in python3.8 – nur Positionsargumente
PEP-bezogen: PEP 570 – Nur-Python-Positionsparameter