2024-04-25 20:22:33 发布
网友
我有一本字典,它的值有时是字符串,有时是函数。对于作为函数的值,有没有方法在访问键时不显式地键入()来执行函数?
()
示例:
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
另一个可能的解决方案是创建实现此行为的自定义词典对象:
>>> 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:
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样式。
TypeError
我认为这在标准库中不太可能(容易),但是您可以使用模块^{}中的lazy_object_proxy.Proxy(它是第三方,所以您需要安装它):
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()检查变量是否可以调用:
callable()
d = {1: "A", 2: "B", 3: fn_1} if callable(d[3]): d[3]() else: d[3]
另一个可能的解决方案是创建实现此行为的自定义词典对象:
一个perhaps more idiomatic solution将使用
try/except
:但请注意,上述方法确实是为了完整性。我不想再使用它了。As pointed out in the comments,它将屏蔽函数引发的
TypeError
。您可以测试TypeError
的确切内容,但在这一点上,您最好使用LBYL样式。我认为这在标准库中不太可能(容易),但是您可以使用模块^{} 中的
lazy_object_proxy.Proxy
(它是第三方,所以您需要安装它):使用
callable()
检查变量是否可以调用:相关问题 更多 >
编程相关推荐