如何在带有关键字参数的函数中使用 __name__?

0 投票
2 回答
1025 浏览
提问于 2025-04-18 02:20

我想知道如何在一个函数中使用name,并通过它传递一个关键字参数。

比如,我有一个这样的函数:

def func(keyword1='A'):
     print keyword1

我可以这样做:

func.__name__
>> 'func'

但是,我想这样做:

func(keyword1='B').__name__
>>> 'func'

我想这样做的原因是因为我有另一个方法,它需要把这个函数作为参数传入,并且需要提取这个函数的名字,然后用不同的关键字来运行这个函数。

所以,我真正想要做的是让这个函数能够正常工作:

def Function_Name_And_Result(x):
    print x.__name__ + x()

Function_Name_And_Result(func(keyword1='B'))
>> funcB

2 个回答

3

如果你有一个方法需要接收一个函数,那就直接传入这个函数,而不是它的返回值。

你实际上是在调用这个函数。.__name__ 属性是用在你调用后的返回值上的。如果你把一个函数调用的返回值传给你的方法,实际上你并没有传递这个函数本身。

如果你需要传递一个函数,并且这个函数在方法内部需要用到特定的参数,你可以把这些额外的参数传进去,让方法来使用这些参数:

def Function_Name_And_Result(x, *args, **kw):
    print x.__name__, x(*args, **kw)

这样你仍然可以传入你的函数对象本身

Function_Name_And_Result(func, keyword1='B')

示例:

>>> def Function_Name_And_Result(x, *args, **kw):
...     print x.__name__, x(*args, **kw)
... 
>>> def func(keyword1='A'):
...      print keyword1
... 
>>> Function_Name_And_Result(func, keyword1='B')
func B
None
5

Python中的函数也是对象,所以你可以像对待其他对象一样传递它们。你现在做的事情(显然是行不通的)是传递调用函数后的结果。你想要做的是传递函数本身和函数的参数:

def print_function_name_and_result(func, *args, **kw):
    print "%s : %s" % (func.__name__, func(*args, **kw))

print_function_name_and_result(func, keyword1='B')
>> func : B

撰写回答