您可以在Python 3.6及更高版本中使用PEP
526变量注释。您可以使用泛型注释将
lambda结果分配给的变量:
typing.Callable
from typing import Callablefunc: 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 Protocolclass 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'>}当然,当您想对类型提示运行静态分析器时,并不是像这样的动态注释会为您提供帮助。



