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

Get lambda function's name as string

提问人:Ηλίας 提问时间:4/10/2014 最后编辑:Martijn PietersΗλίας 更新时间:11/18/2023 访问量:19869

问:

如何获取 lambda 函数的名称?

使用该属性返回:__name__<lambda>

def myfunc():
    pass
myfunc_l = lambda :None

print myfunc.__name__
print myfunc_l.__name__

>>myfunc
>><lambda>

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

Python 函数 lambda

评论

2赞 aisbaa 4/10/2014
你期待什么名字?
4赞 Bartosz Marcinkowski 4/10/2014
我认为 lambda 有时被称为匿名函数是有原因的。
3赞 Scott Hunter 4/10/2014
@OP:那么,如果您将相同的 lambda 分配给第二个变量,您期望的名称是什么?
2赞 glglgl 4/10/2014
你期望输出什么?print(lambda: None)
1赞 Scott Hunter 4/10/2014
@OP:因为,有时当你将 lambda 分配给一个变量时,它会采用该变量的名称,但有时它不会?

答:

27赞 Martijn Pieters 4/10/2014 #1

Lambda 是匿名的,这意味着它们没有名称。

如果您觉得他们应该有一个名字,您可以随时为其分配一个名字:__name__

myfunc_l = lambda: None
myfunc_l.__name__ = 'foo'

请注意,Python 无法知道您已将函数对象分配给特定名称;赋值在执行表达式之后进行。请记住,您甚至不必分配:lambdalambdalambda

result = (lambda x: x ** 2)(4)

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

several_lambdas = [lambda y: (y // 2) for y in range(10, 20)]

在这两种情况下,都没有要分配给这些对象的名称。

另一方面,成熟的函数定义是语句,而不是表达式,并且语要求您指定名称。如果不命名生成的函数,就永远不能使用语句,这就是 Python 可以为对象分配名称的原因:defdef

>>> def foo(): pass
...
>>> print foo.__name__
'foo'

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

5赞 Benjamin 5/26/2015 #2

解决方法:

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

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

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

3赞 Vinayak Thatte 6/30/2022 #3

Lambda 函数名称始终在环境变量中可用,因此应按以下方式访问:

os.environ['AWS_LAMBDA_FUNCTION_NAME']

https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html#configuration-envvars-runtime

评论

0赞 rcepre 9/19/2023
这与提出的问题无关。
0赞 Todd 11/18/2023 #4

您可以从 lambda 处理程序参数中获取它。context

请看这里:https://docs.aws.amazon.com/lambda/latest/dg/python-context.html

print("function_name:", context.function_name)