将lambda函数的名称作为字符串

时间:2014-04-10 10:14:54

标签: python function lambda

如何获得lambda函数的名称?

使用__name__属性返回<lambda>

def myfunc():
    pass
myfunc_l = lambda :None

print myfunc.__name__
print myfunc_l.__name__

>>myfunc
>><lambda>

我期待myfunc_l,但我得到<lambda>

2 个答案:

答案 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;名称。 注意:这在空闲命令行中不起作用。