python dictionary methods




Dictionary-Wert als Funktion, die aufgerufen werden soll, wenn auf den Schlüssel zugegriffen wird, ohne "()" zu verwenden (3)

Ich habe ein Wörterbuch, das manchmal Werte als Zeichenfolgen und manchmal als Funktionen hat. Für die Werte, die Funktionen sind, gibt es eine Möglichkeit, die Funktion auszuführen, ohne explizit () einzugeben, wenn auf den Schlüssel zugegriffen wird?

Beispiel:

d = {1: "A", 2: "B", 3: fn_1}
d[3]() # To run function

Ich will:

d = {1: "A", 2: "B", 3: magic(fn_1)}
d[3] # To run function

Ich denke nicht, dass das mit der Standardbibliothek (einfach) möglich ist, aber Sie könnten lazy_object_proxy.Proxy aus dem Modul lazy_object_proxy (es ist ein Drittanbieter, also müssen Sie es installieren):

>>> import lazy_object_proxy
>>> def fn_1():
...     print('calculation')
...     return 1000
...
>>> d = {1: "A", 2: "B", 3: lazy_object_proxy.Proxy(fn_1)}
>>> print(d[3])
calculation
1000

Verwenden Sie callable() , um zu überprüfen, ob die Variable, nun, aufrufbar ist:

d = {1: "A", 2: "B", 3: fn_1}
if callable(d[3]):
    d[3]()
else:
    d[3]

Eine andere mögliche Lösung besteht darin, ein benutzerdefiniertes Wörterbuchobjekt zu erstellen, das dieses Verhalten implementiert:

>>> class CallableDict(dict):
...     def __getitem__(self, key):
...         val = super().__getitem__(key)
...         if callable(val):
...             return val()
...         return val
...
>>>
>>> d = CallableDict({1: "A", 2: "B", 3: lambda: print('run')})
>>> d[1]
'A'
>>> d[3]
run

Eine vielleicht idiomatische Lösung wäre die Verwendung von try/except :

def __getitem__(self, key):
    val = super().__getitem__(key)
    try:
        return val()
    except TypeError:
        return val

Beachten Sie jedoch, dass die obige Methode wirklich für Vollständigkeit ist. Ich würde es nicht empfehlen. Wie in den Kommentaren erwähnt , würde es TypeError 's maskieren, die von der Funktion TypeError werden. Sie könnten den genauen Inhalt von TypeError , aber zu diesem Zeitpunkt wäre es besser, den LBYL-Stil zu verwenden.





callback