Puede, en cierto modo, en Python 3.6 y versiones posteriores usando anotaciones de variables PEP 526 . Puede anotar la variable a la que asigna el lambda
resultado con el typing.Callable
genérico :
from typing import Callable
func: Callable[[str, str], int] = lambda var1, var2: var1.index(var2)
Esto no adjunta la información de sugerencia de tipo al objeto de función en sí, solo al espacio de nombres en el que almacenó el objeto, pero esto suele ser todo lo que necesita para fines de sugerencia de tipo.
Sin embargo, también puede usar una declaración de función en su lugar; la única ventaja que lambda
ofrece a es que puede poner una definición de función para una expresión simple dentro de una expresión más grande. Pero la lambda anterior no es parte de una expresión más grande, solo es parte de una declaración de asignación, vinculándola a un nombre. Eso es exactamente lo def func(var1: str, var2: str): return var1.index(var2)
que lograría una declaración.
Tenga en cuenta que no se puede hacer anotaciones *args
o **kwargs
argumentos por separado o bien, como la documentación de Callable
los estados:
No hay sintaxis para indicar argumentos opcionales o de palabra clave; estos tipos de funciones rara vez se utilizan como tipos de devolución de llamada.
Esa limitación no se aplica a un protocolo PEP 544 con un método__call__
; utilice esto si necesita una definición expresiva de qué argumentos deben aceptarse. Necesita Python 3.8 o instalar el typing-extensions
proyecto para un backport:
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
Para la lambda
expresión en sí , no puede usar ninguna anotación (la sintaxis en la que se construye la sugerencia de tipo de Python). La sintaxis solo está disponible para def
declaraciones de función.
De PEP 3107 - Anotaciones de funciones :
La sintaxis de lambda no admite anotaciones. La sintaxis de lambda podría cambiarse para admitir anotaciones, requiriendo paréntesis alrededor de la lista de parámetros. Sin embargo, se decidió no realizar este cambio porque:
- Sería un cambio incompatible.
- De todos modos, los Lambda están castrados.
- La lambda siempre se puede cambiar a una función.
Aún puede adjuntar las anotaciones directamente al objeto, el function.__annotations__
atributo es un diccionario escribible:
>>> 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'>}
No es que las anotaciones dinámicas como estas vayan a ayudarlo cuando desee ejecutar un analizador estático sobre sus sugerencias de tipo, por supuesto.