59. Variable Argumente

Manchmal ist nicht klar, welche Argumente eine Funktion wohl nehmen soll. Das ist inbesondere dann so, wenn wir Methoden von Oberklassen überschreiben – wir möchten vielleicht nur die Argumente auswerten, deren Bedeutung wir kennen, und alle anderen unverändert weitergeben.

In Python gibt es dazu die Schreibweise *args. Sie sagt: Stecke alle positionalen Argmente, die nicht von formalen Parametern abgedeckt sind, in ein Tupel und binde es an args. Das kann z.B. auch verwendet werden, um Funktionen mit beliebig vielen Argumenten zu schreiben. Eine Emulation der C-Bibliotheksfunktion printf könnte beispielsweise so aussehen:

>>> def printf(format, *args):
...     print format%args,
...
>>> printf("%s: %d\n", "gezählt", 2)
gezählt: 2
>>> printf("Das ist %s vo%s\n", "das Haus",
  "m Nikolaus")
Das ist das Haus vom Nikolaus

Analog bekommt ein Formalparameter, der mit zwei Sternchen gekennzeichnet ist, alle nicht schon „verbrauchten” Keyword-Argumente in einem Dictionary zugewiesen, in dem jedem übergebenen Namen der entsprechende Wert zugeordnet ist.

>>> def makedict(**kwargs):
...     return kwargs
...
>>> makedict(schluss=1, muss=2, rhein=3, fein=4)
{’muss’: 2, ’fein’: 4, ’schluss’: 1, ’rhein’: 3}

– was natürlich so nur geht, wenn wir Dictionaries mit als Python-Namen zugelassenen Strings als Schlüsseln bauen wollen.

Im Allgemeinen kann man für den Aufruf von Methoden der Oberklasse, deren Argumentlisten wir Umständen nicht kennen (wollen), folgendes Pattern verwenden:

class Daughter(Mother):
  def __init__(self, myarg, *args, **kwargs):
    Mother.__init__(self, *args, **kwargs)
    self.myarg = myarg

Da Klassen auch Objekte sind, liefert Mother.__init__ einfach eine Referenz auf diese Methode. Da sie aber zur Klasse (und nicht zu einer Instanz) gehört, ist sie ungebunden (unbound). Deshalb müssen wir die konkrete Instanz (self) selbst übergeben.


Markus Demleitner

Copyright Notice