让我们说我有一个函数foo
:
def foo():
print('something')
我将上述函数传递给lambda函数,并将其分配给变量。
bar = lambda: foo
因此,如果我有bar
对象,如何提取传递给它的函数的名称,即foo
?
我尝试使用bar
列出该dir(bar)
对象的所有方法,但找不到很多可以提取所需结果的方法。
答案 0 :(得分:4)
您不能直接执行此操作,但是可以调用bar
,该方法返回foo
,并检查其__name__
属性:
>>> bar().__name__
'foo'
答案 1 :(得分:0)
您为什么要bar = lambda: foo
而不是bar = foo
?
lambda
返回一个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