目前,在Python中,函数的参数和返回类型可以是类型提示,如下所示:
def func(var1: str, var2: str) -> int:
return var1.index(var2)
Run Code Online (Sandbox Code Playgroud)
表示该函数接受两个字符串,并返回一个整数.
但是,这种语法与lambdas非常混淆,它看起来像:
func = lambda var1, var2: var1.index(var2)
Run Code Online (Sandbox Code Playgroud)
我已经尝试在参数和返回类型上添加类型提示,我无法找出一种不会导致语法错误的方法.
是否可以输入提示lambda函数?如果没有,是否有计划暗示lambda,或任何原因(除了明显的语法冲突)为什么不呢?
Mar*_*ers 41
不,您不能使用带有lambda表达式的注释(构建Python类型提示的语法).语法仅适用于typing.Callable函数语句.
lambda的语法不支持注释.通过在参数列表周围要求括号,可以更改lambda的语法以支持注释.然而,决定不进行此更改,因为:
- 这将是一个不相容的变化.
- 无论如何,Lambda都是绝育的.
- lambda始终可以更改为函数.
您仍然可以将注释直接附加到对象,该*args属性是可写字典:
from typing import Callable
func: Callable[[str, str], int] = lambda var1, var2: var1.index(var2)
Run Code Online (Sandbox Code Playgroud)
当然,当您想要在类型提示上运行静态分析器时,并不是像这些动态注释会帮助您.
jan*_*jan 37
从Python 3.6开始,你可以(参见PEP 526):
from typing import Callable
is_even: Callable[[int], bool] = lambda x: (x % 2 == 0)
Run Code Online (Sandbox Code Playgroud)
正如用户cz所指出的,这与注释非匿名函数的签名不同.如果您在上面的示例中传递str变量,Mypy v0.620不会抱怨is_even.
小智 13
我非常不喜欢将 lambda 函数分配给标识符(请参阅Is it pythonic:naming lambdas)。如果您仍然想这样做,这里已经有答案了。
如果你不这样做,只是想让类型检查器做他们的事情,答案是typing.cast:
from typing import cast, Callable
cast(Callable[[int], int], lambda x: x + 1)("foo")
# error: Argument 1 has incompatible type "str"; expected "int"
Run Code Online (Sandbox Code Playgroud)
rtv*_*iii 12
对于那些在编写代码时只想快速访问智能感知的人来说,一种近乎黑客的做法是在 lambda 声明之前对参数进行类型注释,完成您的工作,然后才使用该参数来隐藏它。
x: YourClass
map(lambda _: x.somemethod ...) # x has access to methods defined on YourClass
Run Code Online (Sandbox Code Playgroud)
然后,就在之后:
x: YourClass # can remove or leave
map(lambda x: x.somemethod, ListOfYourObjects) # inner x now shadows the argument
Run Code Online (Sandbox Code Playgroud)