Was bedeutet der Schrägstrich, wenn help() Methodensignaturen auflistet?

Lesezeit: 6 Minuten

Benutzeravatar von Joschua
Joschua

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.

                                        ...

Benutzeravatar von Martijn Pieters
Martijn Pieters

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.

  • Ein interessanter Nebeneffekt ist, dass die Namen von Positionsargumenten nicht miteinander in Konflikt stehen **kwargswas für die funktionale Programmierung oder das Dekorieren von Funktionen nützlich sein kann, bei denen die Namen der Decorator-Argumente mit den Argumenten der dekorierten Funktion in Konflikt stehen könnten.

    – Hugodberg

    19. Dezember 2021 um 14:22 Uhr

  • Du hast erklärt was, nicht warum! Sollte erwähnen, warum dies nützlich ist – und wie @hugovdberg oben sagte, geht es darum, nicht in Konflikt zu geraten **kwargs

    – Marcos Pereira

    27. Januar um 13:24 Uhr

  • @MarcosPereira: die gestellte Frage Was: Was bedeutet der Schrägstrich in der Ausgabe von help()?.

    – Martijn Pieters

    27. Januar um 13:42 Uhr

  • “Warum” ist eine ganz andere Frage (auf die ich noch nie eine ganz überzeugende Antwort gesehen habe).

    – chepner

    27. Januar um 14:13 Uhr

  • @hugovdberg: Ich war da eine Weile verwirrt, aber du redest von der func Parameter in der Signatur von delay_call2()wo ein Anruf auf Leitung 50 funktioniert, weil die func (Stichwort) Streit wird nicht mit dem in Konflikt geraten func Parameter. Ja, das ist ein glücklicher Nebeneffekt der Syntax, bevor Sie verwenden müssten *args und entpacke das dem zugewiesene Argument func Parameter daraus. Generell gilt: Die Namen in der Funktionssignatur sind Parameter, die in einem Aufrufausdruck übergebenen Werte sind die Argumente. Macht es einfacher, über die Syntax zu sprechen, die auf beiden Seiten von Aufrufen verwendet wird.

    – Martijn Pieters

    28. Januar um 14:04 Uhr


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.

  • Auswahl der / Token, weil “es die umgekehrte Operation von ist *” zeigt, dass Python ein bisschen verrückt ist. Es ist eine Art Synästhesie.

    – Tomasz Gandor

    30. November 2019 um 6:28 Uhr

Benutzeravatar von neotam
neotam

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

1443360cookie-checkWas bedeutet der Schrägstrich, wenn help() Methodensignaturen auflistet?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy