funcion python lambda

python - funcion - ¿Es posible teclear una función lambda?



funcion filter en python (2)

Actualmente, en Python, los parámetros de una función y los tipos de retorno se pueden escribir de la siguiente manera:

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

Lo que indica que la función toma dos cadenas y devuelve un entero.

Sin embargo, esta sintaxis es muy confusa con las lambdas, que parecen:

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

He intentado poner sugerencias de tipo tanto en los parámetros como en los tipos de retorno, y no puedo encontrar una manera que no cause un error de sintaxis.

¿Es posible teclear una función lambda? Si no es así, ¿hay planes para tipificar lambdas, o algún motivo (aparte del obvio conflicto de sintaxis), por qué no?


Desde Python 3.6, puedes (ver PEP 526 ):

from typing import Callable is_even: Callable[[int], bool] = lambda x: (x % 2 == 0)

Como señaló el usuario cz, esto no es lo mismo que anotar la firma de una función no anónima. Mypy v0.620 no se queja si pasa una variable str a is_even en el ejemplo anterior.


No, no puede usar anotaciones (la sintaxis en la que se construyen las sugerencias de tipos de Python) con expresiones lambda . La sintaxis solo está disponible para las declaraciones de la función def .

Desde PEP 3107 - Anotaciones de funciones :

La sintaxis de lambda no admite anotaciones. La sintaxis de lambda podría cambiarse para admitir anotaciones, al requerir paréntesis alrededor de la lista de parámetros. Sin embargo, se decidió no hacer este cambio porque:

  • Sería un cambio incompatible.
  • Lambda está castrado de todos modos.
  • La lambda siempre se puede cambiar a una función.

Aún puede adjuntar las anotaciones directamente al objeto, la function.__annotations__ atributo es un diccionario grabable:

>>> 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 le ayuden cuando quiera ejecutar un analizador estático sobre sus sugerencias de tipo, por supuesto.