以字符串形式获取lambda函数的名称

2024-05-20 00:01:41 发布

您现在位置:Python中文网/ 问答频道 /正文

如何获取lambda函数的名称?

使用__name__属性返回<lambda>

def myfunc():
    pass
myfunc_l = lambda :None

print myfunc.__name__
print myfunc_l.__name__

>>myfunc
>><lambda>

我本来期待着myfunc_l,但我得到了<lambda>


Tags: lambda函数name名称none属性defpass
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

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

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实际上是一样的,除了没有上下文来设置初始名称(以及它们只能表示单个表达式这一事实)。

相关问题 更多 >