当前位置: 首页 > 知识库问答 >
问题:

可以键入一个lambda函数吗?

东方俊明
2023-03-14

目前,在Python中,函数的参数和返回类型可以提示如下:

def func(var1: str, var2: str) -> int:
    return var1.index(var2)

这表明该函数接受两个字符串,并返回一个整数。

然而,该语法与lambda非常混淆,后者看起来像:

func = lambda var1, var2: var1.index(var2)

我尝试过在参数和返回类型上添加类型提示,但我无法找出不会导致语法错误的方法。

是否可以键入提示lambda函数?如果没有,是否计划键入提示lambda,或者任何原因(除了明显的语法冲突)为什么不呢?

共有3个答案

周昊乾
2023-03-14

对于那些在编写代码时只希望快速访问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
米承嗣
2023-03-14

从Python 3.6开始,您可以(参见PEP 526):

from typing import Callable
is_even: Callable[[int], bool] = lambda x: (x % 2 == 0)
房育
2023-03-14

可以在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的语法可以更改为支持注释,方法是在参数列表周围加括号。但是,决定不进行此更改,因为:

  • 这将是一个不兼容的变化
  • 无论如何,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”?非常感谢。