You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取带参数装饰器修饰的函数的__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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 22:00:59