在访问键时作为函数调用的字典值,而不使用“()”

2024-04-25 20:22:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一本字典,它的值有时是字符串,有时是函数。对于作为函数的值,有没有方法在访问键时不显式地键入()来执行函数?

示例:

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

我想要:

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

Tags: to方法函数run字符串示例键入字典
3条回答

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

>>> 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

一个perhaps more idiomatic solution将使用try/except

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

但请注意,上述方法确实是为了完整性。我不想再使用它了。As pointed out in the comments,它将屏蔽函数引发的TypeError。您可以测试TypeError的确切内容,但在这一点上,您最好使用LBYL样式。

我认为这在标准库中不太可能(容易),但是您可以使用模块^{}中的lazy_object_proxy.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

使用callable()检查变量是否可以调用:

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

相关问题 更多 >