以字符串形式获取 lambda 函数的名称
Posted
技术标签:
【中文标题】以字符串形式获取 lambda 函数的名称【英文标题】:Get lambda function's name as string 【发布时间】:2014-05-23 23:39:06 【问题描述】:如何获取 lambda 函数的名称?
使用__name__
属性返回<lambda>
:
def myfunc():
pass
myfunc_l = lambda :None
print myfunc.__name__
print myfunc_l.__name__
>>myfunc
>><lambda>
我期待myfunc_l
,但我得到了<lambda>
【问题讨论】:
你期待什么名字? 我认为 lambda 有时被称为匿名函数是有原因的。 @OP:那么,如果您将相同的 lambda 分配给第二个变量,您希望名称是什么? 你希望print(lambda: None)
输出什么?
@OP:因为,有时当您将 lambda 分配给变量时,它会使用该变量的名称,但有时不会?
【参考方案1】:
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
s 是一样的,真的,除了没有设置初始名称的上下文(以及它们只能表示单个表达式的事实)。
【讨论】:
【参考方案2】:解决方法:
使用检查模块,您可以这样做:
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 命令行中不起作用。
【讨论】:
以上是关于以字符串形式获取 lambda 函数的名称的主要内容,如果未能解决你的问题,请参考以下文章