2010-09-07 3 views
18

Есть ли способ проверить, содержит ли переменная lambda? Контекст Я хотел бы проверить тип в модульном тесте:Как проверить, содержит ли переменная лямбда?

self.assertEquals(lambda, type(myVar)) 

type, кажется, «функция», но я не видел ни одного очевидного типа, чтобы встроенный соответствовать этому. Очевидно, что я мог бы написать это, но он чувствует себя неуклюжим:

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

Не задавайте вопросы как «вики сообщества». –

+3

Я не отвечаю на вопросы «вики», как правило (слишком много головных болей), но короткий ответ: не надо. Lambda не является типом в Python, это просто сокращение объявить функцию. Бесполезно пытаться различать их; нет никакой разницы. –

ответ

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

Спасибо, я пойду за этим. Просто тестирование типа, как я сделал, не является идеальным, так как любая функция будет соответствовать, поэтому проверка ___name___ или func_name - хорошая комбинация поверх этого. Не знаю, насколько вероятно, что внутреннее имя лямбды изменится позже. Это по-прежнему довольно неуклюжий :-) – ralfoide

+0

@ralfoids, согласился на неуклюжесть, но тогда Python 'lambda's _are_ полностью неуклюжий весь путь ;-) Кстати, какая разница делает вам, является ли var' def''d функции или 'лямбда', так или иначе? –

+2

@ralfoide, вы можете использовать 'v .__ name __ == (lambda: None) .__ name__', если вас беспокоит имя' lambda', изменяющееся –

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

Разве это немного хрупко? – ralfoide

+0

Да, это не то, что указано языком, и оно может сломаться в любое время. Не делай этого. –

9

Используйте typesmodule:

from types import * 

assert isinstance(lambda m: m, LambdaType) 

Согласно документации, это безопасно использовать from types import *.

+0

В отличие от принятого ответа, это также работает, если '__name__' лямбда функция изменена. – sevenforce

+6

Это неправильно: types.LambdaType * is * types.FunctionType. Это означает, что это будет соответствовать Lambdas и функциям – polvoazul

+1

Поскольку нет никакой практической разницы, это, вероятно, лучший ответ. –

13

Прошлые годы, но callable(mylambda) вернет True для любой вызываемой функции или метода, включенных лямбда. hasattr(mylambda, '__call__') делает то же самое, но гораздо менее изящный.

Если вам нужно знать, есть ли что-то абсолютно исключительно лямбда, то mylambda.__name__ == "<lambda>" - это то, что я бы использовал.

(Этот ответ имеет отношение к Python2.7.5.)

+1

Для чего это стоит, я бы предложил изменить 'hasattr (mylambda, '__call __')' reference с 'callable (mylambda)' - он делает то же самое под капотом, но это встроенная функция для Python 2, задокументировано на https://docs.python.org/2/library/functions.html#callable. – DreadPirateShawn

+0

Я даже не знал об этом ... Я не удивлен, что есть такая вещь, но я немного смущен, что не нашел ее, когда искал это несколько месяцев назад ... Круто. – Augusta

4

Там нет необходимости делать какие-либо хак, встроенной в inspect модуля обрабатывает его для вас.

import inspect 
print inspect.isfunction(lambda x:x) 
Смежные вопросы