2010-09-07 6 views
18

Existe-t-il un moyen de tester si une variable contient un lambda? Le contexte est que je voudrais vérifier un type dans un test unitaire:Comment puis-je tester si une variable contient un lambda?

self.assertEquals(lambda, type(myVar)) 

Le type semble être « fonction », mais je ne voyais aucun type builtin évident pour le match. De toute évidence, je pourrais écrire cela, mais il se sent maladroit:

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

Ne pas définir les questions comme "wiki de communauté". –

+3

En règle générale, je ne poste pas de réponses aux questions "wiki" (trop de casse-têtes), mais la réponse courte est: ne pas. Lambda n'est pas un type en Python, c'est juste un raccourci pour déclarer une fonction. Il est inutile d'essayer de les distinguer; il n'y a pas de différence. –

Répondre

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

Merci, je vais y aller pour ça. Juste tester le type comme je l'ai fait n'est pas idéal puisque n'importe quelle fonction correspondra ainsi vérifiant ___name___ ou func_name est un bon combo au-dessus de cela. Dunno comment est-il probable que le nom interne de lambda change plus tard. Il est encore assez maladroit :-) – ralfoide

+0

@ralfoids, d'accord sur la maladresse, mais alors Python 'lambda's _are_ totalement maladroit tout le chemin ;-) BTW, quelle différence cela vous fait-il si un var est un' def''d fonction ou 'lambda', de toute façon? –

+2

@ralfoide, Vous pouvez utiliser 'v .__ nom __ == (lambda: Aucun) .__ name__' si vous êtes inquiet du nom de' lambda' changer –

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

N'est-ce pas un peu fragile? – ralfoide

+0

Oui, ce n'est pas quelque chose spécifié par la langue et il peut se rompre à tout moment. Ne fais pas ça. –

9

Utilisez le typesmodule:

from types import * 

assert isinstance(lambda m: m, LambdaType) 

Selon la documentation, il est sûr d'utiliser from types import *.

+0

Contrairement à la réponse acceptée, cela fonctionne aussi si '__name__' du lambda la fonction est modifiée. – sevenforce

+6

Ceci est faux: types.LambdaType * est * types.FunctionType. Cela signifie que cela va correspondre à Lambda et aux fonctions semblables – polvoazul

+1

Puisqu'il n'y a pas de différence pratique, c'est probablement la meilleure réponse. –

13

Il s'agit d'années antérieures, mais callable(mylambda) renverra True pour toute fonction ou méthode appelable, y compris lambda. hasattr(mylambda, '__call__') fait la même chose mais est beaucoup moins élégant.

Si vous avez besoin de savoir si quelque chose est absolument exclusivement un lambda, alors mylambda.__name__ == "<lambda>" est ce que je voudrais utiliser.

(Cette réponse est pertinente à Python2.7.5.)

+1

Pour ce que ça vaut, je suggère de changer la référence 'hasattr (mylambda, '__call __')' avec 'callable (mylambda)' - elle fait la même chose sous le capot, mais c'est une fonctionnalité intégrée pour Python 2, documenté sur https://docs.python.org/2/library/functions.html#callable. – DreadPirateShawn

+0

Je ne savais même pas à ce sujet-- Je ne suis pas surpris qu'il y ait une telle chose, mais je suis un peu confus que je ne l'ai pas trouvé quand je regardais ça il ya des mois ... Cool. – Augusta

4

Il n'y a pas besoin de faire des hacks, construit dans le module inspect gère pour vous.

import inspect 
print inspect.isfunction(lambda x:x) 
Questions connexes