Typehinting lambda 函数作为函数参数

Posted

技术标签:

【中文标题】Typehinting lambda 函数作为函数参数【英文标题】:Typehinting lambda function as function argument 【发布时间】:2018-02-16 17:09:18 【问题描述】:

我有一个接受 lambda 的函数:

def my_function(some_lambda):
  # do stuff
  some_other_variable = some_lambda(some_variable)

my_function(lambda x: x + 2)

我想输入提示传递的 lambda 函数。

我试过了

def my_function(some_lambda: lambda) -> None:
# SyntaxError: invalid syntax
from typing import Lambda
# ImportError: cannot import name 'Lambda'

我的 IDE 在 2.7 straddled typehints 上抱怨类似的事情,例如

def my_function(some_lambda: lambda) -> None:
  # type: (lambda) -> None
# formal parameter name expected

【问题讨论】:

【参考方案1】:

这在您考虑时很明显,但是需要一段时间才能在脑海中注册。 lambda 是一个函数。没有函数类型,但typing 包中有Callable 类型。这个问题的解决方法是

from typing import Callable
def my_function(some_lambda: Callable) -> None:

Python 2 版本:

from typing import Callable
def my_function(some_lambda):
  # type: (Callable) -> None

【讨论】:

您还可以进一步限制函数类型:例如,Callable[[int], int] 是接受 int 并返回 int 的单参数函数的类型。【参考方案2】:

Callable 是您问题的答案。

from typing import Callable


some_lambda: Callable[[int] int] = lambda x: x + 2


def my_function(func: Callable[[int], int]) -> None:
    # do some stuff
        

my_function(some_lambda)

【讨论】:

以上是关于Typehinting lambda 函数作为函数参数的主要内容,如果未能解决你的问题,请参考以下文章

将 lambda 作为模板参数传递给函数指针函数模板化

Lambda 作为函数参数

Kotlin标准库函数 ② ( run 标准库函数 | run 函数传入 Lambda 表达式作为参数 | run 函数传入函数引用作为参数 )

Lambda 函数作为基类

Kotlin函数 ⑦ ( 内联函数 | Lambda 表达式弊端 | “ 内联 “ 机制避免内存开销 - 将使用 Lambda 表达式作为参数的函数定义为内联函数 | 内联函数本质 - 宏替换 )

嵌入传递 lambda 函数作为回调参数