Python: __qualname__ 带有装饰器的函数
Python: __qualname__ of function with decorator
我在另一个 class 的实例方法中使用装饰器 (class),如下所示:
class decorator_with_arguments(object):
def __init__(self, arg1=0, arg2=0, arg3=0):
self.arg1 = arg1
self.arg2 = arg2
self.arg3 = arg3
def __call__(self, f):
print("Inside __call__()")
def wrapped_f(*args):
print(f.__qualname__)
f(*args)
return wrapped_f
class Lol:
@decorator_with_arguments("hello")
def sayHello(self,a1, a2, a3, a4):
print(self.sayHello.__qualname__)
现在,当我打印 self.sayHello.__qualname__
时,它会打印 decorator_with_arguments.__call__.<locals>.wrapped_f
有什么方法可以覆盖它吗?我想在此处查看 Lol.sayHello
(我的原始函数的 qualname)。
我尝试覆盖 __call__
的 @property
__qualname__
(使用静态字符串);没用。
您可以简单地将 __qualname__
属性复制到您的 wrapped_f
包装函数;毕竟应用装饰器时返回的是这个函数。
您可以使用 @functools.wraps()
decorator 以及注意的其他属性来为您执行此操作:
from functools import wraps
class decorator_with_arguments(object):
def __init__(self, arg1=0, arg2=0, arg3=0):
self.arg1 = arg1
self.arg2 = arg2
self.arg3 = arg3
def __call__(self, f):
print("Inside __call__()")
@wraps(f)
def wrapped_f(*args):
print(f.__qualname__)
f(*args)
return wrapped_f
那里的 @wraps(f)
装饰器将相关属性从 f
复制到 wrapped_f
,包括 __qualname__
:
>>> Lol.sayHello.__qualname__
'Lol.sayHello'
我在另一个 class 的实例方法中使用装饰器 (class),如下所示:
class decorator_with_arguments(object):
def __init__(self, arg1=0, arg2=0, arg3=0):
self.arg1 = arg1
self.arg2 = arg2
self.arg3 = arg3
def __call__(self, f):
print("Inside __call__()")
def wrapped_f(*args):
print(f.__qualname__)
f(*args)
return wrapped_f
class Lol:
@decorator_with_arguments("hello")
def sayHello(self,a1, a2, a3, a4):
print(self.sayHello.__qualname__)
现在,当我打印 self.sayHello.__qualname__
时,它会打印 decorator_with_arguments.__call__.<locals>.wrapped_f
有什么方法可以覆盖它吗?我想在此处查看 Lol.sayHello
(我的原始函数的 qualname)。
我尝试覆盖 __call__
的 @property
__qualname__
(使用静态字符串);没用。
您可以简单地将 __qualname__
属性复制到您的 wrapped_f
包装函数;毕竟应用装饰器时返回的是这个函数。
您可以使用 @functools.wraps()
decorator 以及注意的其他属性来为您执行此操作:
from functools import wraps
class decorator_with_arguments(object):
def __init__(self, arg1=0, arg2=0, arg3=0):
self.arg1 = arg1
self.arg2 = arg2
self.arg3 = arg3
def __call__(self, f):
print("Inside __call__()")
@wraps(f)
def wrapped_f(*args):
print(f.__qualname__)
f(*args)
return wrapped_f
那里的 @wraps(f)
装饰器将相关属性从 f
复制到 wrapped_f
,包括 __qualname__
:
>>> Lol.sayHello.__qualname__
'Lol.sayHello'