以字符串形式获取 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,但我得到了&lt;lambda&gt;

【问题讨论】:

你期待什么名字? 我认为 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__ 属性来重命名函数对象,但这不会改变函数的性质。 lambdas 是一样的,真​​的,除了没有设置初始名称的上下文(以及它们只能表示单个表达式的事实)。

【讨论】:

【参考方案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 函数的名称的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中以字符串形式获取类的名称

kinesis代理到lambda,如何获取原始文件和服务器

如何在 SQL Server 中以字符串形式获取详细表记录

从特定字符串中获取数字的 Lambda 函数

使用 lambda 而不是字符串属性名称选择模型属性

获取以某些字母开头的名称列表[关闭]