您可以在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'>}
当然,当您想对类型提示运行静态分析器时,并不是像这样的动态注释会为您提供帮助。