Eine Konzeptions-/Verständnisfrage: Ich muss einen Auskunfts-Geber schreiben, der eine ID zwischen zwei Programmen übersetzt. Ein Tool gibt die ID an und will wissen, wie es beim anderen heißt. Letztlich wird da so etwas stehen wie:
[1] klasse.get_id_by_id2(id2) # Klasse
oder
[2] get_id_by_id2(id2) # Funktion.
Ich habe inzwischen gelernt, dass eine Klasse mit nur einer Funktion eigentlich ein Hinweis ist, dass es sich um eine Funktion handelt und ich eine Funktion schreiben sollte. Aber: Ich muss eine csv-Datei (ca. 200 Datenzeilen) einlesen und im Betrieb zwischen 100 und 200 Abfragen erledigen (lassen). Ich könnte Zeit sparen, wenn ich die Daten in der Klasse vorhalte, statt sie bei jeder Anfrage wieder neu von der Festplatte zu laden.
Wie würdet ihr es lösen?
Funktion oder Klasse?
Ich weiß nicht, ob das der allerbeste Stil ist, aber für "Funktionen mit Gedächtnis" verwende ich persönlich ganz gerne das, was manchmal Funktionsobjekt genannt wird, also Instanzen von Klassen, die __call__ implementieren. Die Datei wird in '__init__' eingelesen und kann dann bei jedem "Funktions"aufruf adressiert werden. Eine andere Variante wäre, das mittels eines Closures zu lösen.pixewakb hat geschrieben: Wie würdet ihr es lösen?
Ich hatte schon gedacht die Frage wäre einfach und hatte ein schlechtes Gewissen, dass ich sie stelle.
Closures kenne ich noch nicht und sehe ich mir morgen direkt an.
@Sirius3: Leuchtet ein und erscheint mir sehr attraktiv. Allerdings brauche ich die Funktionalität in einigen Tools und möchte sie aus einem Modul einbinden. Wie bekomme ich die csv-Datei von der Festplatte in ein Wörterbuch, das ich importieren kann?
Die Klasse oder eine Funktion hat in anderen Fällen dann den Ladevorgang gekapselt und dann Anfragen erledigt.
Closures kenne ich noch nicht und sehe ich mir morgen direkt an.
@Sirius3: Leuchtet ein und erscheint mir sehr attraktiv. Allerdings brauche ich die Funktionalität in einigen Tools und möchte sie aus einem Modul einbinden. Wie bekomme ich die csv-Datei von der Festplatte in ein Wörterbuch, das ich importieren kann?
Die Klasse oder eine Funktion hat in anderen Fällen dann den Ladevorgang gekapselt und dann Anfragen erledigt.
@pixewakb: Bei der Klasse würdest Du das doch wahrscheinlich in der `__init__()` laden — in ein Wörterbuch das ein Attribut auf dem Exemplar ist. Statt Klasse und `__init__()` bräuchtest Du eine Funktion die das Wörterbuch aus der Datei erstellt.
Dann gehst du es falsch an. Schreibe eine Funktion, die die Daten vorbereitet. Schreibe eine weitere Funktion zur Verarbeitung der Daten. Das wäre sozusagen die zweite Methode deiner Klasse. Falls du ziemlich viele Argumente an die Verarbeitung übergeben musst, dann könntest du z.B. ein namedtuple einsetzen, um die Übergabe etwas eleganter zu lösen.pixewakb hat geschrieben:Ich muss eine csv-Datei (ca. 200 Datenzeilen) einlesen und im Betrieb zwischen 100 und 200 Abfragen erledigen (lassen). Ich könnte Zeit sparen, wenn ich die Daten in der Klasse vorhalte, statt sie bei jeder Anfrage wieder neu von der Festplatte zu laden.
@Blackjack:
Danke Dir und Danke an alle, ich stand ziemlich auf dem Schlauch und habe das jetzt kurz erledigt. Da habe ich den Wald vor ... nicht gesehenStatt Klasse und `__init__()` bräuchtest Du eine Funktion die das Wörterbuch aus der Datei erstellt.