如何获取带参数装饰器修饰的函数的__name__属性?
解决带参数装饰器丢失原函数__name__属性的问题
当你用带参数的装饰器装饰函数后,原函数的__name__等元数据会被装饰器内部的包装函数覆盖,导致无法通过foo.__name__获取原函数名称。你可以通过以下两种方法解决:
方法一:手动复制原函数元数据
在装饰器的包装函数中,手动将原函数的__name__等属性复制到包装函数上:
def decorator(arg1=[], arg2=[]): def inner(func): def wrapper(*args, **kwargs): # 执行装饰器逻辑 return func(*args, **kwargs) # 复制原函数的名称和文档字符串等元数据 wrapper.__name__ = func.__name__ wrapper.__doc__ = func.__doc__ return wrapper return inner @decorator(arg1=["a", "b"]) def foo(): pass print(foo.__name__) # 输出: foo
方法二:使用functools.wraps(推荐)
Python标准库functools中的wraps装饰器可以自动帮你复制原函数的所有元数据,用法更简洁规范:
from functools import wraps def decorator(arg1=[], arg2=[]): def inner(func): @wraps(func) # 用wraps装饰包装函数 def wrapper(*args, **kwargs): # 执行装饰器逻辑 return func(*args, **kwargs) return wrapper return inner @decorator(arg1=["a", "b"]) def foo(): pass print(foo.__name__) # 输出: foo
functools.wraps不仅会复制__name__,还会同步原函数的__doc__、__module__、__annotations__等元数据,是处理这类问题的标准方案。
内容的提问来源于stack exchange,提问作者Sal Aslam
相关产品推荐
相关产品推荐

