字典值作为访问密钥时要调用的函数,而不使用"()"

tyl*_*eax 11 python dictionary function callback python-2.7

我有一个字典,其值有时作为字符串,有时作为函数.对于作为函数的值,有一种方法可以在()访问密钥时执行函数而无需显式键入?

例:

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

我想要:

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

Chr*_*ean 12

另一种可能的解决方案是创建一个实现此行为的自定义字典对象:

>>> 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
Run Code Online (Sandbox Code Playgroud)

一个或许更惯用的解决方案是使用try/except:

def __getitem__(self, key):
    val = super().__getitem__(key)
    try:
        return val()
    except TypeError:
        return val
Run Code Online (Sandbox Code Playgroud)

但请注意,上面的方法实际上是为了完整性.我不会建议使用它.正如评论中指出的那样,它将掩盖TypeError由函数引发的.您可以测试其确切内容TypeError,但此时,您最好使用LBYL样式.


MSe*_*ert 6

我不认为(标准库)可以(轻松)使用,但您可以使用lazy_object_proxy.Proxy模块lazy_object_proxy(它是第三方,因此您需要安装它):

>>> 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
Run Code Online (Sandbox Code Playgroud)