如果我们(反常地)要求解释器评估组合 f(f) 会发生什么?

def f(g):

    return g(2)


def square(x):

    return x ** 2

>>> f(square)

4

>>> f(lambda z: z * (z + 1))

6

>>> f(f)

TypeError: 'int' object is not callable

我的解释:


我认为在f(g),g作为一个参数必须是一个功能,使得下部水平函数可以用G = 2的参数来调用。然而f(f),正如前面提到的那样,将自己称为函数,g它必须是一个函数。但是,f(2)不可调用。因此导致错误。


我不确定我是否完全解释了为什么参数g必须是一个函数。以及我是否完整地解释了这个问题。


慕姐8265434
浏览 173回答 1
1回答

临摹微笑

f是一个函数,它有一个参数,g,它必须是一个可调用的,可以被应用到int。也就是说,使用typing模块中的类型提示语法,我们可以说:def f(g: Callable[int, T]) -> T:     return g(2)是否f本身有型Callable[int, T]?int不Callable[int, T]。An不是。f(f)无效的申请也是如此;如果您使用的是Mypy之类的工具,它应该会捕捉到这一点。在运行时,实际上不会检查类型提示。但是运行时类型仍然以相同的方式相互影响。调用会f(f)导致以下调用:f(f)意味着g是f,并导致调用f(2)f(2)意味着g是2,并导致尝试评估2(2)应用()运算符 tog意味着调用__call__特殊方法,但int不实现__call__。因此,您会收到您描述的错误消息:TypeError: 'int' object is not callable
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python