Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python Enhancement Proposals

PEP 3102 – Nur per Schlüsselwort benannte Argumente

Autor:
Talin <viridia at gmail.com>
Status:
Final
Typ:
Standards Track
Erstellt:
22. April 2006
Python-Version:
3.0
Post-History:
28. April 2006, 19. Mai 2006

Inhaltsverzeichnis

Zusammenfassung

Dieses PEP schlägt eine Änderung der Art und Weise vor, wie Funktionsargumente benannten Parametern zugewiesen werden. Insbesondere ermöglicht es die Deklaration von „nur per Schlüsselwort benannten“ Argumenten: Argumente, die nur per Schlüsselwort übergeben werden können und niemals automatisch durch ein positionsgebundenes Argument gefüllt werden.

Begründung

Das aktuelle Paradigma für Funktionsaufrufe in Python erlaubt es, Argumente entweder nach Position oder nach Schlüsselwort anzugeben. Ein Argument kann entweder explizit nach Namen oder implizit nach Position gefüllt werden.

Es gibt oft Fälle, in denen es wünschenswert ist, dass eine Funktion eine variable Anzahl von Argumenten akzeptiert. Die Python-Sprache unterstützt dies mit der ‚varargs‘-Syntax (*name), die angibt, dass alle ‚übrig gebliebenen‘ Argumente als Tupel an den varargs-Parameter übergeben werden.

Eine Einschränkung hierbei ist, dass derzeit alle regulären Argumentplätze gefüllt sein müssen, bevor der vararg-Platz gefüllt werden kann.

Dies ist nicht immer wünschenswert. Man kann sich leicht eine Funktion vorstellen, die eine variable Anzahl von Argumenten entgegennimmt, aber auch eine oder mehrere ‚Optionen‘ in Form von Schlüsselwortargumenten. Derzeit ist der einzige Weg, dies zu tun, die Definition sowohl eines varargs-Arguments als auch eines ‚keywords‘-Arguments (**kwargs) und dann die gewünschten Schlüsselwörter manuell aus dem Dictionary zu extrahieren.

Spezifikation

Syntaktisch sind die vorgeschlagenen Änderungen recht einfach. Die erste Änderung besteht darin, reguläre Argumente nach einem varargs-Argument zuzulassen

def sortwords(*wordlist, case_sensitive=False):
    ...

Diese Funktion akzeptiert eine beliebige Anzahl von positionsgebundenen Argumenten und sie akzeptiert auch eine Schlüsselwortoption namens ‚case_sensitive‘. Diese Option wird niemals durch ein positionsgebundenes Argument gefüllt, muss aber explizit nach Namen angegeben werden.

Nur per Schlüsselwort benannte Argumente müssen keinen Standardwert haben. Da Python vorschreibt, dass alle Argumente an einen Wert gebunden sein müssen, und da der einzige Weg, einen Wert an ein nur per Schlüsselwort benanntes Argument zu binden, per Schlüsselwort ist, sind solche Argumente daher ‚erforderliche Schlüsselwortargumente‘. Solche Argumente müssen vom Aufrufer bereitgestellt werden und sie müssen per Schlüsselwort bereitgestellt werden.

Die zweite syntaktische Änderung besteht darin, den Argumentnamen für ein varargs-Argument weglassen zu können. Die Bedeutung davon ist, nur per Schlüsselwort benannte Argumente für Funktionen zu ermöglichen, die nicht ohnehin ein varargs-Argument hätten

def compare(a, b, *, key=None):
    ...

Die Begründung für diese Änderung ist wie folgt. Stellen Sie sich für einen Moment eine Funktion vor, die mehrere positionsgebundene Argumente sowie ein Schlüsselwortargument entgegennimmt

def compare(a, b, key=None):
    ...

Angenommen, Sie möchten ‚key‘ als nur per Schlüsselwort benanntes Argument haben. Unter der obigen Syntax könnten Sie dies erreichen, indem Sie ein varargs-Argument unmittelbar vor dem Schlüsselwortargument hinzufügen

def compare(a, b, *ignore, key=None):
    ...

Leider wird das ‚ignore‘-Argument auch alle fehlerhaften positionsgebundenen Argumente aufnehmen, die möglicherweise vom Aufrufer bereitgestellt wurden. Da wir bevorzugen, dass unerwünschte Argumente einen Fehler auslösen, könnten wir Folgendes tun

def compare(a, b, *ignore, key=None):
    if ignore:  # If ignore is not empty
        raise TypeError

Als praktische Abkürzung können wir einfach den Namen ‚ignore‘ weglassen, was bedeutet: ‚ab diesem Punkt keine positionsgebundenen Argumente mehr zulassen‘.

(Hinweis: Nach viel Diskussion über alternative Syntaxvorschläge hat sich der BDFL für diese ‚Single-Star‘-Syntax zur Kennzeichnung des Endes von positionsgebundenen Parametern ausgesprochen.)

Verhalten beim Aufruf von Funktionen

Der vorherige Abschnitt beschreibt den Unterschied zwischen dem alten und dem neuen Verhalten. Es ist jedoch auch nützlich, eine Beschreibung des neuen Verhaltens zu haben, die eigenständig ist und sich nicht auf das vorherige Modell bezieht. Dieser nächste Abschnitt versucht daher, eine solche Beschreibung zu geben.

Wenn eine Funktion aufgerufen wird, werden die Eingabeargumente den formalen Parametern wie folgt zugewiesen

  • Für jeden formalen Parameter gibt es einen Platz, der verwendet wird, um den Wert des diesem Parameter zugewiesenen Arguments zu speichern.
  • Plätze, denen Werte zugewiesen wurden, sind als ‚gefüllt‘ markiert. Plätze, denen noch kein Wert zugewiesen wurde, gelten als ‚leer‘.
  • Anfänglich sind alle Plätze als leer markiert.
  • Positionsgebundene Argumente werden zuerst zugewiesen, gefolgt von Schlüsselwortargumenten.
  • Für jedes positionsgebundene Argument
    • Versuchen Sie, das Argument dem ersten ungefüllten Parameterplatz zuzuweisen. Wenn der Platz kein vararg-Platz ist, markieren Sie den Platz als ‚gefüllt‘.
    • Wenn der nächste ungefüllte Platz ein vararg-Platz ist und keinen Namen hat, ist dies ein Fehler.
    • Andernfalls, wenn der nächste ungefüllte Platz ein vararg-Platz ist, werden alle verbleibenden nicht-Schlüsselwortargumente in den vararg-Platz aufgenommen.
  • Für jedes Schlüsselwortargument
    • Wenn ein Parameter mit demselben Namen wie das Schlüsselwort existiert, wird der Argumentwert diesem Parameterplatz zugewiesen. Wenn der Parameterplatz jedoch bereits gefüllt ist, ist dies ein Fehler.
    • Andernfalls, wenn ein ‚keyword dictionary‘-Argument existiert, wird das Argument unter Verwendung des Schlüsselwortnamens als Dictionary-Schlüssel zum Dictionary hinzugefügt, es sei denn, es existiert bereits ein Eintrag mit diesem Schlüssel, in welchem Fall es ein Fehler ist.
    • Andernfalls, wenn kein Schlüsselwort-Dictionary und kein übereinstimmender benannter Parameter existiert, ist dies ein Fehler.
  • Schließlich
    • Wenn der vararg-Platz noch nicht gefüllt ist, weisen Sie ihm ein leeres Tupel als Wert zu.
    • Für jeden verbleibenden leeren Platz: Wenn es einen Standardwert für diesen Platz gibt, füllen Sie den Platz mit dem Standardwert. Wenn es keinen Standardwert gibt, ist dies ein Fehler.

Gemäß der aktuellen Python-Implementierung werden alle aufgetretenen Fehler durch Auslösen einer TypeError signalisiert. (Wenn Sie etwas anderes wünschen, ist dies ein Thema für ein anderes PEP.)

Abwärtskompatibilität

Das in diesem PEP spezifizierte Verhalten beim Funktionsaufruf ist eine Obermenge des bestehenden Verhaltens – das heißt, es wird erwartet, dass alle bestehenden Programme weiterhin funktionieren werden.


Quelle: https://github.com/python/peps/blob/main/peps/pep-3102.rst

Zuletzt geändert: 2025-02-01 08:59:27 GMT