Lesedauer 2 Minuten

Callback-Funktionen machen Sinn, wenn Daten in einer Schleife verarbeitet werden und sind eine hervorragende Methode um generische, d.h. wiederverwendbare Klassen zu schreiben. Individueller Code wird dann elegant in Callbacks ausgelagert.

Python Callbacks: Ein einfaches Beispiel

Die folgende Klasse liest eine CSV-Datei und gibt diverse Adressdaten im Terminal aus:

Inhalt von file.csv:

Problem: Die Klasse kann leider nur für Adressdaten verwendet werden, da die Felder Name, Vorname, EMail individuell sind.
Für Produkt-Daten müsste dann eine extra Klasse geschrieben werden.

Mit wenigen Änderungen kann daraus eine generische Klasse gemacht werden:

Integration der Callback-Funktion: Die Anpassungen im Detail

  • Die Methode run() erhält als zusätzlichen Parameter die Adresse unserer Callback-Funktion.
    Der Parameter heisst in unserem Fall callback. Der Name könnte auch beliebig anders gewählt werden.
  • Aus der Adresse der Callback-Funktion wird wieder ein Funktionsaufruf, indem wir die Klammern samt Parameter hinzufügen:
    callback(row).
  • In __main__ definieren wir unsere Callback-Funktion namens printFields().
  • Die Adresse von printFields(), d.h. der Funktionsname ohne Klammern, übergeben wird dann in der letzten Zeile an die run-Methode der Klasse:
    p.run(‘products.csv’, printFields)

Für Produkt-Daten schaut der Aufruf dann wie folgt aus:

Inhalt von products.csv:

Wie Du siehst, wird nur die Callback-Funktion geändert und unser generic CSVProcessor übernimmt den Rest.

Optionale Callback-Funktionen

Machmal macht es Sinn eine Callback-Funktion optional zu machen. Wir benötigen dann eine Möglichkeit, in der Klasse zu testen, ob eine Callback-Funktion übergeben wurde oder nicht. Hierfür gibt es in Python eine Funktion namens callable(variable). Ist die übergebene Variabel die Adresse einer ausführbare Funktion, liefert callable() True, ansonsten False:

Der Parameter callback  in der run-Methode hat den Default-Wert None, wenn keine Callback-Funktion übergeben wurde.
callable(callback) liefert dann False.

 

Hat Dir der Beitrag gefallen?

Wenn Du Fragen oder Anmerkungen zu diesem Beitrag hast, dann starte einen Kommentar. DANKE für Dein Feedback!