如何提取作为参数传递给Python的lambda函数的函数名?

时间:2019-09-11 13:42:31

标签: python lambda

让我们说我有一个函数foo

def foo():
    print('something')

我将上述函数传递给lambda函数,并将其分配给变量。

bar = lambda: foo

因此,如果我有bar对象,如何提取传递给它的函数的名称,即foo

我尝试使用bar列出该dir(bar)对象的所有方法,但找不到很多可以提取所需结果的方法。

3 个答案:

答案 0 :(得分:4)

您不能直接执行此操作,但是可以调用bar,该方法返回foo,并检查其__name__属性:

>>> bar().__name__
'foo'

答案 1 :(得分:0)

您为什么要bar = lambda: foo而不是bar = foolambda返回一个foo对象,这意味着您必须执行以下操作:

bar = lambda: foo
# now to call foo:
bar()()

函数是python中的一流对象,因此您不需要lambda即可实现简单的操作。

bar = foo
print(bar.__name__) # foo
# now to call foo:
bar()

如果您要传递默认参数,则情况会不同:

def foo(x, y, z):
    print(x, y, z)
y = 3
z = 2
bar = lambda x, y=y, z=z: foo(x, y, z)
# now to call foo:
bar(1) # 1 3 2
# but printing the name is this case is more tricky since the 
# lambda isn't return the function object but the return value
# of that function.
# Thus you would need to use inspect like the answer below.

答案 2 :(得分:-1)

如果您不想调用该函数来获取他的名字(如其他答案中所建议),则可以inspect来获取代码,然后从那里获取所传递函数的名称。名称:

def foo():
    print('something')

bar = lambda: foo

print(inspect.getsource(bar))

输出:

  

bar = lambda:foo

查找提供的功能应该不复杂,即:

func_code = inspect.getsource(bar)
passed_function = func_code.split(' ')[-1]

print(passed_function)

输出:

  

foo

即使您有多个参数,也可以提取所提供函数的名称:

import inspect


def foo(x, y, z):
    print('something')

bar = lambda x, y, z: foo(x, y, z)

func_code = inspect.getsource(bar)
print(func_code)
passed_function = func_code.split('(')[0].split(' ')[-1]

print(passed_function)

输出:

  

foo