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

Ηλί*_*ίας 4 python lambda function

我如何获得lambda函数的名称?

使用__name__属性返回<lambda>:

def myfunc():
    pass
myfunc_l = lambda :None

print myfunc.__name__
print myfunc_l.__name__

>>myfunc
>><lambda>
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 15

Lambda表达式是匿名的,这意味着它们不会一个名字.

__name__如果你觉得他们应该有一个名字,你总是可以指定一个名字:

myfunc_l = lambda: None
myfunc_l.__name__ = 'foo'
Run Code Online (Sandbox Code Playgroud)

请注意,Python无法知道您将lambda函数对象分配给特定名称; 赋值发生在lambda表达式执行之后.记住,你甚至不需要分配lambda:

result = (lambda x: x ** 2)(4)
Run Code Online (Sandbox Code Playgroud)

或者您可以将其存储lambda在列表中:

several_lambdas = [lambda y: (y // 2) for y in range(10, 20)]
Run Code Online (Sandbox Code Playgroud)

并且在这两个上下文中都没有要分配给这些对象的名称.

另一方面,完整的函数定义是语句,而不是表达式,def语句要求您指定名称.如果def没有命名结果函数,就永远不能使用语句,这就是Python可以为对象指定名称的原因:

>>> def foo(): pass
...
>>> print foo.__name__
'foo'
Run Code Online (Sandbox Code Playgroud)

您仍然可以分配foo其他内容,删除foo全局引用,通过分配__name__属性重命名函数对象,但它不会更改函数的性质.lambda实际上,除了没有设置初始名称的上下文(以及它们只能表示单个表达式的事实)之外,它们是相同的.


Ben*_*min 5

解决办法:

使用检查模块,您可以执行以下操作:

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
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以获得源代码并提取“匿名”名称。注意:这在空闲命令行中不起作用。