2010-09-07 14 views
18

C'è un modo per verificare se una variabile detiene un lambda? Il contesto è che vorrei per controllare un tipo in una prova di unità:Come posso verificare se una variabile contiene un lambda?

self.assertEquals(lambda, type(myVar)) 

La type sembra essere "funzione", ma non ho visto nessun tipo predefinito ovvio per abbinarlo. Ovviamente, ho potuto scrivere questo, ma ci si sente goffa:

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

Non impostare domande come "wiki della comunità". –

+3

Non invio le risposte alle domande "wiki" come regola (troppi mal di testa), ma la risposta breve è: no. Lambda non è un tipo in Python, è solo una scorciatoia per dichiarare una funzione. Non ha senso cercare di distinguerli; non c'è differenza. –

risposta

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

Grazie, vado per quello. Basta testare il tipo come ho fatto io non è l'ideale dato che qualsiasi funzione si verificherà in modo tale che il controllo ___name___ o func_name sia una buona combinazione in aggiunta. Non so quanto sia probabile che il nome Lambda interno cambi in seguito. E 'ancora abbastanza maldestro :-) – ralfoide

+0

@ralfoids, d'accordo sulla goffaggine, ma poi Python 'lambda's _are_ è totalmente maldestro fino in fondo ;-) A proposito, che differenza ti fa se una var è un' def''d funzione o 'lambda', comunque? –

+2

@ralfoide, potresti usare 'v .__ nome __ == (lambda: Nessuno) .__ nome__' se sei preoccupato per il nome di' lambda' che cambia –

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

Non è un po 'fragile? – ralfoide

+0

Sì, questo non è qualcosa specificato dalla lingua e potrebbe interrompersi in qualsiasi momento. Non farlo –

9

Utilizzare la typesmodule:

from types import * 

assert isinstance(lambda m: m, LambdaType) 

Secondo la documentazione, è sicuro da usare from types import *.

+0

In contrasto con la risposta accettata, che funziona anche se '__name__' del lambda la funzione è cambiata. – sevenforce

+6

Questo è sbagliato: types.LambdaType * è * types.FunctionType. Ciò significa che questo corrisponderà a Lambda e Funzioni allo stesso modo – polvoazul

+1

Poiché non c'è alcuna differenza pratica, questa è probabilmente la risposta migliore. –

13

Questo è scaduto, ma callable(mylambda) restituirà True per qualsiasi funzione richiamabile o metodo, lambda incluso. hasattr(mylambda, '__call__') fa la stessa cosa ma è molto meno elegante.

Se hai bisogno di sapere se qualcosa è assolutamente esclusivo un lambda, quindi mylambda.__name__ == "<lambda>" è quello che userei.

(Questa risposta è rilevante per Python2.7.5.)

+1

Per quello che vale, suggerirei di cambiare il riferimento 'hasattr (mylambda, '__call __')' con callable (mylambda) '- fa la stessa cosa sotto il cofano, ma è una funzionalità incorporata per Python 2, documentato su https://docs.python.org/2/library/functions.html#callable. – DreadPirateShawn

+0

Non lo sapevo nemmeno ... non sono sorpreso che ci sia una cosa del genere, ma sono un po 'confuso di non averlo trovato quando stavo guardando questo mese fa ... Cool. – Augusta

4

Non c'è bisogno di fare alcun hack, il costruito nel inspect modulo gestisce per voi.

import inspect 
print inspect.isfunction(lambda x:x) 
Problemi correlati