为什么函数__name__返回包装器函数名,而不是代码所在函数的名称?


def logging_decorator(function):
def wrapper(*args, **kwargs):
print(f'This is {function.__name__}')
output = function(*args, **kwargs)
return wrapper

@logging_decorator
def a_function(a, b, c):
print(f'This is the Function name {a_function.__name__}')
return a * b * c
object = a_function(3, 4, 5)

与python修饰符和玩我不明白如下:

为什么
print(f'This is the Function name {a_function.__name__}')

输出'这是函数名包装器'?输出不应该是'这是函数名a_function'吗?

函数定义完成后。

a_function = def (a, b, c){...}

包装器将包装您的函数。你可以这样想象:

a_function = logging_decorator(a_function)

函数logging_decorator返回函数名wrapper。现在,a_function只是一个参考,它链接到函数wrapper

为了得到你想要的,我试了这样做:

from functools import wraps
def logging_decorator(function):
@wraps(function)
def wrapper(*args, **kwargs):
print(f'This is {function.__name__}')
output = function(*args, **kwargs)
return wrapper

@logging_decorator
def a_function(a, b, c):
print(f'This is the Function name {a_function.__name__}')
return a * b * c
@logging_decorator
def b_function(a, b, c):
print(f'This is the Function name {b_function.__name__}')
return a * b * c
object = a_function(3, 4, 5)
object = b_function(3, 4, 5)

它解决了你的问题。

最新更新