Ηλί*_*ίας 4 python lambda function
我如何获得lambda函数的名称?
使用__name__
属性返回<lambda>
:
def myfunc():
pass
myfunc_l = lambda :None
print myfunc.__name__
print myfunc_l.__name__
>>myfunc
>><lambda>
Run Code Online (Sandbox Code Playgroud)
我在期待,myfunc_l
但我得到了<lambda>
Mar*_*ers 15
Lambda表达式是匿名的,这意味着它们不会有一个名字.
__name__
如果你觉得他们应该有一个名字,你总是可以指定一个名字:
myfunc_l = lambda: None
myfunc_l.__name__ = 'foo'
Run Code Online (Sandbox Code Playgroud)
请注意,Python无法知道您将lambda
函数对象分配给特定名称; 赋值发生在lambda
表达式执行之后.记住,你甚至不需要分配lambda
:
result = (lambda x: x ** 2)(4)
Run Code Online (Sandbox Code Playgroud)
或者您可以将其存储lambda
在列表中:
several_lambdas = [lambda y: (y // 2) for y in range(10, 20)]
Run Code Online (Sandbox Code Playgroud)
并且在这两个上下文中都没有要分配给这些对象的名称.
另一方面,完整的函数定义是语句,而不是表达式,def
语句要求您指定名称.如果def
没有命名结果函数,就永远不能使用语句,这就是Python可以为对象指定名称的原因:
>>> def foo(): pass
...
>>> print foo.__name__
'foo'
Run Code Online (Sandbox Code Playgroud)
您仍然可以分配foo
其他内容,删除foo
全局引用,通过分配__name__
属性重命名函数对象,但它不会更改函数的性质.lambda
实际上,除了没有设置初始名称的上下文(以及它们只能表示单个表达式的事实)之外,它们是相同的.
解决办法:
使用检查模块,您可以执行以下操作:
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
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您可以获得源代码并提取“匿名”名称。注意:这在空闲命令行中不起作用。
归档时间: |
|
查看次数: |
6067 次 |
最近记录: |