Python的dispatch方法表中为什么不能在函数后加括号?
Python分派表两种写法的行为差异原理
该差异本质是Python函数调用的基础语法规则导致的,和分派表本身的实现逻辑无关。
带括号写法的执行逻辑
- 当你在函数名后加括号
self.test()时,Python会立即执行该函数,并将函数的返回值作为整个表达式的结果。 - 你第一个版本的代码中,定义mapping字典时会依次计算每个键对应的值,所以
self.test()和self.test2()会在字典创建时全部执行,自然会同时打印1和2。 - 此时你的mapping字典实际存储的是两个函数的返回值:
{1: 1, 2: 2},后续执行mapping[self.address]()时相当于调用整数对象,会直接抛出'int' object is not callable的类型错误。
不带括号写法的执行逻辑
- 当你写
self.test不带括号时,整个表达式代表的是函数对象本身的引用,不会触发函数执行。 - 此时mapping字典存储的是两个方法的引用:
{1: <bound method Aave.test of <__main__.Aave object at 0x...>>, 2: <bound method Aave.test2 of <__main__.Aave object at 0x...>>},字典创建阶段不会执行任何函数。 - 只有当你从字典中取出对应方法引用后再加括号
mapping[self.address]()时,才会触发对应函数的执行,自然只会运行匹配到key的目标函数。
拓展提示
如果你的待分派函数需要传入参数,可以用lambda表达式包装后存入分派表,同样不会提前执行函数:
def function_map(self, param): mapping = {1: lambda p: self.test(p), 2: lambda p: self.test2(p)} return mapping[self.address](param)
内容的提问来源于stack exchange,提问作者chia yongkang
相关产品推荐
相关产品推荐

