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样式.
我不认为(标准库)可以(轻松)使用,但您可以使用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)
| 归档时间: |
|
| 查看次数: |
4781 次 |
| 最近记录: |