Python defaultdict - Wie Parameter übergeben

Blutschlumpf

Fleet Admiral
Registriert
März 2001
Beiträge
20.350
Hi,

ich brauche mal Hilfe mit der defaultdict() Funktion.
Ich verstehe nicht wie ich das mit einer Funktion kombiniere, die einen Parameter erwartet bzw. wie ich an den Key komme, der abgefragt wurde.

Python:
from collections import defaultdict

def MeineFunktion(uebergebener_key):
    ### Irgendeine Magie, die den Wert für den Key ("Schnitzel") raussucht
    return magie_ergebnis

mein_dictionary = defaultdict(MeineFunktion)

print(mein_dictionary["Schnitzel"])

Das endet (verständlicherweise) mit "TypeError: MeineFunktion() missing 1 required positional argument: 'uebergebener_key'"

Ich finde Dutzende Beispiele, die verwenden aber alle Funktionen ohne Parameter um da nen leeren Wert oder nen statischen default-Wert zu setzen.

Konkret möchte ich hier Daten von einer langsamen API cachen.
Sprich mein_dictionary ist erstmal leer, mein_dictionary["Schnitzel"] wird das erste Mal aufgerufen, eine API wird abgefragt, die "Schnitzel" als Parameter braucht und da was zurückliefert.
Sobald mein_dictionary["Schnitzel"] das 2. mal benutzt wird, kommt der Wert direkt aus dem dictionary.
 
Du hast eine eigene Funktion definiert die einen Parameter erwartet. Rufst die Funktion dann aber ohne einen Parameter auf. Was sich auch mit deiner Fehlermeldung deckt?
 
  • Gefällt mir
Reaktionen: BeBur und e_Lap
Das ist klar, aber wie lautet der Parameter in der defaultdict() Funktion, der den aufgerufenen Key repräsentiert und wie übergebe ich ihn?
Falls es gar keine gibt und das irgendwie was vordefiniertes ist: Wie greife ich in der Funktion da drauf zu?

Es wird ja entweder so laufen:
Python:
def MeineFunktion(key):
...

mein_dictionary = defaultdict(MeineFunktion, uebergebener_key)

Oder so:
Python:
def MeineFunktion():
    print(uebergebener_key)

mein_dictionary = defaultdict(MeineFunktion)

Welche Version ist richtig und wie komme ich an "uebergebener_key" bzw. wie lautet der Platzhalter dafür?
 
Zuletzt bearbeitet:
Blutschlumpf schrieb:
Das ist klar, aber wie lautet der Parameter in der defaultdict() Funktion, der den aufgerufenen Key repräsentiert und wie übergebe ich ihn?
das geht nicht mit defaultdict -> https://docs.python.org/3/library/collections.html#collections.defaultdict

_ _ missing _ _(key)
If default_factory is not None, it is called without arguments to provide a default value for the given key, this value is inserted in the dictionary for the key, and returned.

bau dir selber was:
Python:
class CachingDefaultDict(dict):

    def __getitem__(self, key):

        try:
            return dict.__getitem__(self, key)
        except KeyError:
            # dein api aufruf hier
            val = "_defval_"
            dict.__setitem__(self, key, val)
            return dict.__getitem__(self, key)


d = CachingDefaultDict()
d["a"] = 1
print(d["a"])  # 1
print(d["b"])  # "_defval_"
 
Zuletzt bearbeitet:
Vorab: Bin selber kein Experte auf dem Gebiet, aber vielleicht hilfts :)

Für mich sieht das etwas verkompliziert aus. Ich würde in der Funktion einfach nur gucken ob der Key schon im Dictionary ist und wenn nicht (if key not in mein_dict), den API Request machen, das Ergebnis dann mit dem Key speichern. Ob die Funktion dann am Ende den Wert returned oder nicht, hängt dann vom weiteren Vorgehen ab. Bei jedem weiteren Aufruf wird zuerst der im Dictionary gespeicherte Wert ausgegeben wenn der Key schon drin ist.

Kann natürlich sein, dass ich komplett daneben liege :D
 
Zurück
Oben