Benutzer-Werkzeuge

Webseiten-Werkzeuge


python:overload_decorator
  • Teil der typing-Library
  • ermöglicht es anzugeben welche Parameter-Kombinationen möglich sind, in dem die Funktionsdeklaration mehrfach angeben werden kann mit verschiedenen Parametern
  • ermöglicht es **kwargs in der eigentlichen Methoden zu nutzen, aber trotzdem mögliche Parameter zu listen, inkl. Typ
  • macht kein eigentlichen Overloading
    • man hat also nicht abhängig von den übergebenen Parametern verschiedene Methoden (um das zu realisieren siehe singledispatch
    • statt dessen kann man verschiedene Parameter-Konstellationen beschreiben mit der die Methode aufgerufen werden kann (es wird aber letztendlich immer die gleiche Methode ausgeführt)

Mehrere Parameter-Kombinationen

from typing import overload

@overload
def bla(eins:str, zwei:str):...

@overload
def bla(kaiser:str):...

def bla(kaiser=None, eins=None, zwei=None):
    print(kaiser, eins, zwei)

bla(kaiser="Hallo")

Obiges Beispiel definiert eine Methode „bla“ mit 3 Keyword-Argumenten.
Praktisch soll aber nur entweder „Kaiser“ oder („eins“ und „zwei“) setzbar sein, aber nicht alle 3 gleichzeitig.
Das wird erreicht in dem man mehrere Deklarationen mit @overload-Dekorator schreibt, nur diese definieren dann mit welchen Parametern die Methode dann jeweils aufgerufen werden kann (die Deklaration bei der Methodendefinition ist nicht sichtbar).

Hinweis: Keyword-Argumente können scheinbar nur noch als Keyword-Argumente benutzt werden, nicht mehr als positional Arguments.

kwargs und vorgegebene Parameter

  • normalerweise ist es nicht möglich bei der Nutzung von **kwargs oder *args Hinting einzubauen welche Parameter möglich sind

from typing import overload
 
@overload
def bla(eins:str, zwei:str):...

def bla(**kwargs):
    print(eins, zwei)
 
bla(kaiser="Hallo")

In obigem Beispiel benutzt die eigentliche Methode kwargs und hat damit alle Parameter als Dictionary zur Verfügung.
Gleichzeitig gibt es aber Hinting welche Keyword-Parameter möglich sind und welchen Typ sie haben → das erfolgt per @upload-Dekorator und der darauf folgenden Deklaration.

python/overload_decorator.txt · Zuletzt geändert: 2022/07/14 18:52 von root