2014-04-10 2 views
3

Как я могу получить имя лямбда-функции?Получить имя функции лямбда как строку

Использование __name__ свойство возвращает <lambda>:

def myfunc(): 
    pass 
myfunc_l = lambda :None 

print myfunc.__name__ 
print myfunc_l.__name__ 

>>myfunc 
>><lambda> 

Я ожидал myfunc_l, но я получил <lambda>

+0

Почему бы вам не попробовать? – sshashank124

+0

Я пробовал, все, что у меня есть,

+2

Какое имя вы ожидали? – aisbaa

ответ

12

Лямбда являются анонимными, что означает они не имеют имя.

Вы всегда можете присвоить имя __name__, если вы чувствуете, что они должны иметь один или иначе:

myfunc_l = lambda: None 
myfunc_l.__name__ = 'foo' 

Обратите внимание, что Python не может знать, что вы назначили объект lambda функции для определенного имени; присваивание происходит после выполнения выражения lambda. Помните, что вы не должны даже назначить lambda:

result = (lambda x: x ** 2)(4) 

или вы могли бы хранить lambda в списке:

several_lambdas = [lambda y: (y // 2) for y in range(10, 20)] 

и ни в одном контексте есть имя, чтобы присвоить эти объекты ,

С другой стороны, определения полномасштабных функций - это операторы, а не выражения, а инструкция def требует указания имени. Вы никогда не можете использовать def заявления, не называя полученную функцию, поэтому Python может присвоить имя объекта:

>>> def foo(): pass 
... 
>>> print foo.__name__ 
'foo' 

Вы все еще можете присвоить foo к чему-то еще, удалите foo глобальную ссылку, названием функции объект, назначив атрибут __name__, но он не изменит характер функции. lambda s те же, действительно, кроме того, что нет никакого контекста для установки начального имени (и того факта, что они могут представлять только одно выражение).

0

Работа вокруг:

Используя инспектировать модуль, который вы можете сделать это:

from inspect import getsource 
get_lambda_name = lambda l: getsource(l).split('=')[0].strip() 
print(get_lambda_name(get_lambda_name)) 

# result: get_lambda_name 

Таким образом, вы получите исходный код и извлечь «анонимный» имя. Примечание: это не работает в командной строке Idle.

Смежные вопросы