当前位置: 首页 > 面试题库 >

是否可以输入提示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,或者有什么原因(除了明显的语法冲突)为何?


问题答案:

您可以在Python 3.6及更高版本中使用PEP
526变量注释
。您可以使用泛型注释将lambda结果分配给的变量:typing.Callable

from typing import Callable

func: Callable[[str, str], int] = lambda var1, var2: var1.index(var2)

这不会将类型提示信息附加到功能对象本身,而不会附加到存储对象的名称空间,但这通常是类型提示所需要的。

但是,您也可以只使用函数语句。商品的唯一优点lambda是可以将一个简单表达式的函数定义 放在
一个较大的表达式中。但是上述lambda并不是较大表达式的一部分,它只是赋值语句的一部分,并将其绑定到名称。这正是def func(var1: str, var2: str): return var1.index(var2)声明所要实现的。

请注意,您也不能单独注释*args**kwargs作为Callable状态文档:

没有语法指示可选参数或关键字参数。这种函数类型很少用作回调类型。

该限制不适用于使用方法的PEP
544
协议__call__
;如果您需要明确表示应接受哪些参数,请使用此选项。您需要Python
3.8 为反向移植安装typing-extensions项目:

from typing-extensions import Protocol

class SomeCallableConvention(Protocol):
    def __call__(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始终可以更改为函数。

您仍然可以将注释直接附加到对象,该function.__annotations__属性是可写字典:

>>> 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'>}

当然,当您想对类型提示运行静态分析器时,并不是像这样的动态注释会为您提供帮助。



 类似资料:
  • 我有一段Java代码,它从可选#map的输入参数中包含的集合中删除一个元素 where项目。getDocId()返回一组字符串ID,并保证不为null。 我已经测试过它并有效;如果选项为空或docId不存在于集合中,ret为false。 但是,可选#map是否可以执行此操作并更改成员集的状态并返回Set#删除操作的布尔结果? 我到处找了找,找不到关于这件事的确切答案。

  • 目前,在Python中,函数的参数和返回类型可以提示如下: 这表明该函数接受两个字符串,并返回一个整数。 然而,该语法与lambda非常混淆,后者看起来像: 我尝试过在参数和返回类型上添加类型提示,但我无法找出不会导致语法错误的方法。 是否可以键入提示lambda函数?如果没有,是否计划键入提示lambda,或者任何原因(除了明显的语法冲突)为什么不呢?

  • 问题内容: 我想始终显示输入“数字”字段的上/下箭头。这可能吗?到目前为止,我还没有任何运气… HTML: CSS: 问题答案: 您可以使用Opacity属性(至少在Chrome中)实现此目的: 如上所述,这可能仅在Chrome中有效。因此,请谨慎使用此代码,不要对其他浏览器进行回退。

  • 我希望始终显示输入“数字”字段的上/下箭头。这可能吗?到目前为止我还没有任何运气 http://jsfiddle.net/oneeezy/qunbnL6u/ HTML: CSS:

  • 问题内容: 无论如何,是否有一个微调器提示与编辑文本字段所提供的提示类似。我知道您可以使用提示给您一个标题栏,但在单击微调器之前,仍将初始微调器字段留为空白。我目前有一种粗略的方法来将虚拟字段设置为旋转器数组的第一部分,即问题,然后在末尾进行检查以确保旋转器不等于问题字符串。有没有更清洁/更好的方法呢? 谢谢! 问题答案: 这是一个比Ravi Vyas代码简单一些的解决方案(感谢您的启发!):

  • 我想知道OpenCV是否能够将摄像头(dev/video1)设置为复合或S-video输入。 我使用的摄像头仅在复合输入中运行,但默认情况下,v4l2在S-Video输入中打开dev/video1。V4l2能够通过QT V4l2 utils应用程序从S视频转换为复合输入。 opencv正在使用v4l从相机捕获图像,我想在代码中使用OpenCV更改为复合输入。那有可能吗?如果不是,解决办法是什么?

  • 问题内容: 当我在JavaScript程序中找到一个对象时,我只会看到输出,这对于弄清楚它是什么对象(甚至是什么类型的对象)不是很有帮助。 在C#中,我习惯于重写以能够自定义对象的调试器表示形式。我可以用JavaScript做类似的事情吗? 问题答案: 您也可以在Javascript中覆盖。参见示例: 见这对如何在JavaScript中确定对象类型名称的讨论。

  • 问题内容: 我想使用Streams.intRange(int start,int end,int step)实现反向排序的流。但是,似乎java.util.Streams类不再可用(但是它仍在标准库的rt.jar中)。此方法是在其他类中还是被其他方法替代? 问题答案: 实际上,JDK中再也没有这种方法了。您能获得的下一个最接近的位置是,但是只会一步一步走。 一种解决方案是实施您自己的解决方案。例如