Lesedauer 2 Minuten

Eine Callback-Funktion 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 Callback-Funktionen ausgelagert.

Python Callback-Funktion: Ein einfaches Beispiel

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

Inhalt von addresses.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 printAddressFields(), 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!