Python装饰器的应用场景

装饰器的应用场景

附加功能

数据的清理或添加:

函数参数类型验证 @require_ints 类似请求前拦截

数据格式转换 将函数返回字典改为 JSON/YAML 类似响应后篡改

为函数提供额外的数据 mock.patch

函数注册

在任务中心注册一个任务

注册一个带信号处理器的函数

不同应用场景下装饰器实现

函数注册表

简单注册表

funcs = []

def register(func):

    funcs.append(func)

    return func

   

   

@register

def a():

    return 3

   

@register

def b():

    return 5

   


# 访问结果

result = [func() for func in funcs]

注册表隔离(使用类的不同实例)


class Registry(object):

    def __init__(self):

        self._funcs = []

   

    def register(self, func):

        self._funcs.append(func)

       

    def run_all(self):

        return [func() for func in self._funcs]

       

       

r1 = Registry()

r2 = Registry()


@r1.register

def a():

    return 3

   

@r2.register

def b():

    return 5

   

@r1.register

@r2.register

执行时封装代码

类型检查

from functools import wraps


def require_ints(func):

    @wraps(func)  # 将func的信息复制给inner

    def inner(*args, **kwargs):

        for arg list(args) + list(kwargs.values()):

            if not isinstance(arg, int:

龙腾原创

联系作者:xiaowanzi02620

图片发自App

你可能感兴趣的:(Python装饰器的应用场景)