2010-09-07 7 views
18

¿Hay alguna manera de comprobar si una variable contiene un lambda? El contexto es que me gustaría comprobar un tipo en una prueba de unidad:¿Cómo puedo probar si una variable contiene una lambda?

self.assertEquals(lambda, type(myVar)) 

El type parece ser "función", pero no vi ningún tipo interno obvia para que coincidan. Obviamente, podría escribir esto, pero se siente torpe:

self.assertEquals(type(lambda m: m), type(myVar)) 
+0

No establezca las preguntas como "comunidad wiki". –

+3

No publico respuestas a preguntas "wiki" como regla (demasiados dolores de cabeza), pero la respuesta corta es: no. Lambda no es un tipo en Python, es solo taquigrafía declarar una función. No tiene sentido tratar de distinguir entre ellos; no hay diferencia. –

Respuesta

13
def isalambda(v): 
    LAMBDA = lambda:0 
    return isinstance(v, type(LAMBDA)) and v.__name__ == LAMBDA.__name__ 
+0

Gracias, iré por eso. Simplemente probar el tipo como lo hice no es ideal ya que cualquier función coincidirá, por lo que verificar ___name___ o func_name es un buen combo además de eso. Sin embargo, no es probable que el nombre lambda interno cambie más tarde. Todavía es bastante torpe :-) – ralfoide

+0

@ralfoids, de acuerdo con la torpeza, pero luego Python 'lambda's es totalmente torpe todo el camino ;-) Por cierto, ¿qué diferencia hace si una var es un' def''d función o 'lambda', de todos modos? –

+2

@ralfoide, podría usar 'v .__ name __ == (lambda: None) .__ name__' si le preocupa el nombre de' lambda' cambiando –

1
mylambda.func_name == '<lambda>' 
+0

¿No es eso un poco frágil? – ralfoide

+0

Sí, esto no es algo especificado por el idioma y podría romperse en cualquier momento. No lo hagas –

9

Uso del typesmodule:

from types import * 

assert isinstance(lambda m: m, LambdaType) 

De acuerdo con los documentos, es seguro de usar from types import *.

+0

En contraste con la respuesta aceptada, eso también funciona si '__name__' de la lambda la función ha cambiado – sevenforce

+6

Esto está mal: types.LambdaType * is * types.FunctionType. Eso significa que esto coincidirá con Lambdas y Functions por igual – polvoazul

+1

Dado que no existe una diferencia práctica, esta es probablemente la mejor respuesta. –

13

Esto es años vencidos, pero callable(mylambda) devolverá True para cualquier función o método invocable, incluido lambdas. hasattr(mylambda, '__call__') hace lo mismo, pero es mucho menos elegante.

Si necesita saber si algo es absolutamente exclusivamente una lambda, entonces mylambda.__name__ == "<lambda>" es lo que usaría.

(esta pregunta es relevante para Python2.7.5.)

+1

Por lo que vale, sugeriría cambiar la referencia 'hasattr (mylambda, '__call __')' con 'invocable (mylambda) '- hace lo mismo debajo del capó, pero es una característica incorporada para Python 2, documentado en https://docs.python.org/2/library/functions.html#callable. – DreadPirateShawn

+0

Ni siquiera sabía sobre eso ... No me sorprende que exista tal cosa, pero estoy un poco confundido porque no lo encontré cuando estaba buscando esto hace meses ... Genial. – Augusta

4

No hay necesidad de hacer ningún hacks, el construido en el módulo de inspect lo hace por ti.

import inspect 
print inspect.isfunction(lambda x:x) 
Cuestiones relacionadas