目前,在Python中,函数的参数和返回类型可以提示如下:
def func(var1: str, var2: str) -> int:
return var1.index(var2)
这表明该函数接受两个字符串,并返回一个整数。
然而,该语法与lambda非常混淆,后者看起来像:
func = lambda var1, var2: var1.index(var2)
我尝试过在参数和返回类型上添加类型提示,但我无法找出不会导致语法错误的方法。
是否可以键入提示lambda函数?如果没有,是否计划键入提示lambda,或者任何原因(除了明显的语法冲突)为什么不呢?
对于那些在编写代码时只希望快速访问intellisense的人来说,一个几乎是黑客的做法是在lambda声明之前键入注释参数,完成工作,然后用参数对其进行阴影处理。
x: YourClass
map(lambda _ : x.somemethod ...) # x has access to methods defined on YourClass
然后,紧接着:
x: YourClass # can remove or leave
map(lambda x: x.somemethod, ListOfYourObjects) # inner x now shadows the argument
从Python 3.6开始,您可以(参见PEP 526):
from typing import Callable
is_even: Callable[[int], bool] = lambda x: (x % 2 == 0)
可以在Python 3.6及更高版本中使用PEP 526变量注释。您可以通过键入来注释分配lambda结果的变量。可调用通用:
from typing import Callable
func: Callable[[str, str], int] = lambda var1, var2: var1.index(var2)
这不会将类型提示信息附加到函数对象本身,只会附加到存储对象的命名空间,但这通常是类型提示所需的全部。
然而,您也可以只使用function语句;lambda提供的唯一优点是,可以将简单表达式的函数定义放在更大的表达式中。但是上面的lambda不是更大表达式的一部分,它只是赋值语句的一部分,将其绑定到名称。这正是定义func(var1:str,var2:str)返回var1的结果。索引(var2)语句将实现。
请注意,您也不能单独注释参数,因为可调用的文档说明:
没有表示可选或关键字参数的语法;此类函数类型很少用作回调类型。
该限制不适用于具有调用方法的PEP 544协议;如果您需要对应该接受的参数进行表达性定义,请使用此选项。您需要Python 3.8或安装backport的类型扩展项目:
from typing_extensions import Protocol
class SomeCallableConvention(Protocol):
def __call__(self, var1: str, var2: str, spam: str = "ham") -> int:
...
func: SomeCallableConvention = lambda var1, var2, spam="ham": var1.index(var2) * spam
对于lambda表达式本身,不能使用任何注释(Python的类型暗示所基于的语法)。该语法仅适用于def函数语句。
来自PEP 3107-功能注释:
lambda的语法不支持注释。lambda的语法可以更改为支持注释,方法是在参数列表周围加括号。但是,决定不进行此更改,因为:
您仍然可以将注释直接附加到对象,即函数__annotations_uu属性是一个可写字典:
>>> def func(var1: str, var2: str) -> int:
... return var1.index(var2)
...
>>> func.__annotations__
{'var1': <class 'str'>, 'return': <class 'int'>, 'var2': <class 'str'>}
>>> lfunc = lambda var1, var2: var1.index(var2)
>>> lfunc.__annotations__
{}
>>> lfunc.__annotations__['var1'] = str
>>> lfunc.__annotations__['var2'] = str
>>> lfunc.__annotations__['return'] = int
>>> lfunc.__annotations__
{'var1': <class 'str'>, 'return': <class 'int'>, 'var2': <class 'str'>}
当然,当您想在类型提示上运行静态分析器时,这样的动态注释并不能帮助您。
问题内容: 我有2个Lambda函数-一个产生报价,另一个将报价变成订单。我希望Order lambda函数调用Quote函数来重新生成报价,而不是仅仅从不受信任的客户端接收报价。 我看过我能想到的任何地方-但看不到如何链接或调用函数…肯定存在! 问题答案: 我找到了使用的方法。 您可以在以下位置找到该文档:http : //docs.aws.amazon.com/AWSJavaScriptSDK
我需要从AWS SES获取消息,并将其发布到AWS MSK(Kafka)主题。这可能吗?我目前的理解是,所有MSK客户端必须生活在同一个VPC中。如何适当地配置Lambda函数?
主要用途是为了方便,在函数内部有小的内联函数。 我环顾了谷歌,检查了Java的函数包,但是没有找到。这可能吗?
出于测试目的,我在AWS上创建了一些Lambda函数(命名为< code>test_function什么的),然后在测试后,我发现这些函数可以在prod env中使用。 是否可以重命名Lambda函数?以及如何重命名?或者我应该创建一个新的并复制粘贴源代码?
问题内容: 在Java中,lambda是否可以接受多种不同类型? 即:单个变量起作用: Varargs也可以工作: 但是我想要可以接受许多不同类型参数的东西,例如: 为了方便起见,主要用途是在函数内部具有小的内联函数。 我环顾了Google并检查了Java的Function Package,但找不到。这可能吗? 问题答案: 如果使用多个类型参数定义这样的功能接口,则是可能的。没有这样的内置类型。(
我需要制作两个lambda函数,一个用参数调用另一个,被调用的函数将参数打印出来。我很难让它工作:第一个函数: 请告知我应该在被调用函数中输入什么代码才能接收参数“hello Jenny”?非常感谢。