python - 如何扩展 functools.wraps 装饰器的功能?

标签 python decorator functools

我想创建一个新的装饰器来代替 @wraps(f) ,它可以完成 @wraps(f) 的所有魔法其他的东西。我该怎么做?

具体来说,我有几个以下形式的装饰器:

def decorator(f):
    @wraps(f)
    def wrapper(*args, **kwargs):
        # does some stuff in here
        return f(*args, **kwargs)
    if not hasattr(wrapper, '_first_line'):
        wrapper._first_line = inspect.getsourcelines(f)[1]
    return wrapper

看来我应该能够创建一个像 @wraps_with_first_line(f) 这样的装饰器,它将完成 @wraps(f) 正在做的所有事情以及 如果不是hasattr(wrapper, '_first_line'):wrapper._first_line =spect.getsourcelines(f)[1]

最佳答案

您应该遵循添加指向包装函数的 __wrapped__ 属性的良好做法,而不是添加该包装函数的单个属性。 New versions functools.wraps() 会自动执行此操作,但如果您使用的 Python 版本低于 3.2,您也可以轻松扩展 wraps() 以添加 __wrapped__:

def my_wraps(wrapped, **kwargs):
    def decorator(wrapper):
        functools.update_wrapper(wrapper, wrapped, **kwargs)
        wrapper.__wrapped__ = wrapped
    return decorator

编辑:这是一个从可能多重修饰的函数中提取原始函数的函数:

def orig_function(f):
    try:
        while True:
            f = f.__wrapped__
    except AttributeError:
        return f

关于python - 如何扩展 functools.wraps 装饰器的功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10032023/

相关文章:

python - Beautiful Soup 4 CSS 选择器的工作方式与教程显示的不同

python - Enum 可以用作调度表吗?

python - 部分函数 "officially"是否可以pickl?

python - 实现前置附加参数的 functools.partial

python - 函数式编程 vs 列表理解

python - Itertools 与嵌套循环性能对比

python - 如何确定一个多边形是否在另一个多边形内部?

angularjs - 如何在 HTTP 请求上设置模块特定的自定义 header ?

python - 装饰器将方法标记为即使调用多次也只执行一次

python - 无法制作自定义 Django View 装饰器(带参数)