Was bedeutet der Schrägstrich in der Ausgabe von help ()?

148

Was bedeutet die Ausgabe von /Python 3.4 vor der schließenden Klammer?helprange

>>> 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.

                                        ...
Joschua
quelle

Antworten:

185

Es bedeutet das Ende der Positions nur Parameter , Parameter Sie können nicht als Keyword - Parameter verwenden. Vor Python 3.8 konnten solche Parameter nur in der C-API angegeben werden.

Dies bedeutet, dass das keyArgument to __contains__nur von position ( range(5).__contains__(3)) übergeben werden kann, nicht als Schlüsselwortargument ( range(5).__contains__(key=3)), was Sie können mit Positionsargumenten in pure-Python - Funktionen zu tun.

Siehe auch die Argument Clinic- Dokumentation:

Um alle Parameter in Argument Clinic als nur positionell zu markieren, fügen Sie /nach dem letzten Parameter eine Zeile hinzu, die genauso eingerückt ist wie die Parameterzeilen.

und die (jüngste Ergänzung zu) den Python-FAQ :

Ein Schrägstrich in der Argumentliste einer Funktion zeigt an, dass die Parameter davor nur positionell sind. Nur Positionsparameter sind solche ohne einen extern verwendbaren Namen. Beim Aufruf 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.8 , siehe PEP 570 - Nur Python-Positionsparameter . 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-Position-Parameter .

Nur-Positions-Parameter können zu saubereren und klareren APIs führen, reine Python-Implementierungen von ansonsten nur C-Modulen konsistenter und einfacher zu warten machen, und da Nur-Position-Parameter nur sehr wenig Verarbeitung erfordern, führen sie zu schnellerem Python-Code.

Martijn Pieters
quelle
21

Ich habe diese Frage selbst gestellt. :) Fand heraus, dass dies /ursprünglich von Guido hier vorgeschlagen wurde .

Alternativer Vorschlag: Wie wäre es mit '/'? Es ist das Gegenteil von '*', was "Schlüsselwortargument" bedeutet, und '/' ist kein neues Zeichen.

Dann wurde sein Vorschlag gewonnen .

Heh. Wenn das stimmt, gewinnt mein '/' Vorschlag:

 def foo(pos_only, /, pos_or_kw, *, kw_only): ...

Ich denke, das sehr relevante Dokument, das dies abdeckt, ist PEP 570 . Wo der Rückblick gut aussieht.

Rekapitulieren

Der Anwendungsfall bestimmt, welche Parameter in der Funktionsdefinition verwendet werden sollen:

 def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2):

Als Anleitung:

Verwenden Sie nur die Position, 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, wenn Namen explizit angegeben werden.


Wenn die Funktion mit endet /

def foo(p1, p2, /)

Dies bedeutet, dass alle funktionalen Argumente positionell sind.

Prosti
quelle
6
Die Wahl des /Tokens, weil "es die umgekehrte Operation von *" ist, zeigt, dass Python nur ein bisschen verrückt ist. Es ist eine Art Synästhesie.
Tomasz Gandor
6

Schrägstrich (/) zeigt an, dass alle Argumente davor nur Positionsargumente sind. Die Funktion "Nur Positionsargumente" wurde in Python 3.8 hinzugefügt, nachdem PEP 570 akzeptiert wurde. Ursprünglich wurde diese Notation in PEP 457 - Notation für Notation für Nur-Position-Parameter definiert

Parameter in der Funktionsdefinition vor dem Schrägstrich (/) sind nur positionell und Parameter, denen ein Schrägstrich (/) folgt, können gemäß der Syntax beliebig sein. Wenn Argumente nur Positionsparametern zugeordnet werden, die ausschließlich auf ihrer Position beim Aufrufen einer Funktion basieren. Das Übergeben von Nur-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 positionell oder Schlüsselwort sein können.

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 ungültig, wodurch eine Ausnahme TypeError ausgelöst wird, 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 Nur-Positions-Argumente als Schlüsselwort-Argumente übergeben: 'a, b'

Viele in Python integrierte Funktionen akzeptieren nur Positionsargumente, bei denen das Übergeben von Argumenten per Schlüsselwort keinen Sinn ergibt. Zum Beispiel akzeptiert die eingebaute Funktion len nur ein Positionsargument (nur). Wenn das Aufrufen von len als len (obj = "Hallo Welt") die Lesbarkeit beeinträchtigt, überprüfen Sie die Hilfe (len).

>>> help(len)
Help on built-in function len in module builtins:

len(obj, /)
    Return the number of items in a container.

Nur Positionsparameter erleichtern die Wartung der zugrunde liegenden c / library-Funktionen. Damit können Parameternamen von nur Positionsparametern in Zukunft geändert werden, ohne dass das Risiko besteht, dass der Clientcode, der die API verwendet, beschädigt wird

Last but not least können wir nur mit Positionsparametern ihre Namen für Schlüsselwortargumente mit variabler Länge 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}

Nur Positionsparameter sind hier besser unter Typen von Funktionsargumenten in Python: Nur Positionsparameter

Die Syntax nur für Positionsparameter wurde offiziell zu python3.8 hinzugefügt. Überprüfen Sie, was neu ist. Python3.8 - Nur Positionsargumente

PEP-bezogen: PEP 570 - Nur Python-Positionsparameter

Neotam
quelle