How can I get a lambda function's name?
Using the __name__
property returns <lambda>
:
def myfunc():
pass
myfunc_l = lambda :None
print myfunc.__name__
print myfunc_l.__name__
>>myfunc
>><lambda>
I was expecting myfunc_l
but I got <lambda>
Lambdas are anonymous, which means they do not have a name.
You can always assign a name to __name__
if you feel they should have one anyway:
myfunc_l = lambda: None
myfunc_l.__name__ = 'foo'
Note that Python cannot know that you assigned the lambda
function object to a specific name; the assignment takes place after the lambda
expression was executed. Remember, you don't even have to assign a lambda
:
result = (lambda x: x ** 2)(4)
or you could store the lambda
in a list:
several_lambdas = [lambda y: (y // 2) for y in range(10, 20)]
and in neither context is there a name to assign to these objects.
Full-blown function definitions on the other hand are statements, not expressions, and the def
statement requires that you specify a name. You can never use a def
statement without naming the resulting function, which is why Python can assign the name to the object:
>>> def foo(): pass
...
>>> print foo.__name__
'foo'
You can still assign foo
to something else, delete the foo
global reference, rename the function object by assigning to the __name__
attribute, but it won't change the nature of the function. lambda
s are the same, really, apart from the fact that there's no context to set the initial name (and the fact that they can only represent a single expression).