获取Lambda函数的名称作为字符串
我怎么才能获取一个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']
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
也是一样,实际上除了没有上下文来设置初始名字(以及它们只能表示一个单一表达式)之外,它们没有什么不同。