如何获得lambda函数的名称?
使用__name__
属性返回<lambda>
:
def myfunc():
pass
myfunc_l = lambda :None
print myfunc.__name__
print myfunc_l.__name__
>>myfunc
>><lambda>
我期待myfunc_l
,但我得到<lambda>
答案 0 :(得分:15)
Lambdas是匿名的,表示他们没有拥有名称。
如果你认为他们应该拥有一个名字,你总是可以为__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
是相同的。
答案 1 :(得分:1)
解决方法:
使用inspect模块可以执行以下操作:
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
通过这种方式,您可以获取源代码并提取&#34;匿名&#34;名称。 注意:这在空闲命令行中不起作用。