获取Lambda函数的名称作为字符串

13 投票
4 回答
21421 浏览
提问于 2025-04-18 02:10

我怎么才能获取一个lambda函数的名字呢?

__name__这个属性去查看的话,会返回<lambda>

def myfunc():
    pass
myfunc_l = lambda :None

print myfunc.__name__
print myfunc_l.__name__

>>myfunc
>><lambda>

我本来期待看到myfunc_l,结果却得到了<lambda>

4 个回答

-1

你可以从lambda处理函数的context参数中获取它。

详细信息可以查看这里:https://docs.aws.amazon.com/lambda/latest/dg/python-context.html

print("function_name:", context.function_name)
1

Lambda函数的名称总是可以通过环境变量获取,所以应该可以这样访问:

os.environ['AWS_LAMBDA_FUNCTION_NAME']

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

5

解决方法:

你可以使用 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

这样你就可以获取源代码并提取出“匿名”的名字。注意:这个方法在 Idle 命令行中是无法使用的。

27

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也是一样,实际上除了没有上下文来设置初始名字(以及它们只能表示一个单一表达式)之外,它们没有什么不同。

撰写回答