2014-04-10 46 views
3

如何获取lambda函数的名称?将lambda函数的名称作为字符串获取

使用__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

lambda表达式是匿名的,这意味着他们的名称。

,如果你觉得他们应该有一个反正你总是可以指定一个名称__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除了没有上下文来设置初始名称(以及它们只能表示单个表达式的事实)之外,其他的都是相同的。

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命令行中不起作用。

相关问题