美文网首页
python 装饰器的应用:控制函数是否可用

python 装饰器的应用:控制函数是否可用

作者: 远行_2a22 | 来源:发表于2019-11-26 17:06 被阅读0次
  • 在开发中,遇到需求:
    有很多的调试信息,
    (1)正常流程不需要,但是本地测试却需要显示
    (2)正常客户端不需要,编辑器模式下需要显示
    平常的方法就是用多个标志位来控制,提交代码的时候屏蔽掉相关代码。这里使用装饰器来控制。
# -*- coding:utf-8 -*-
from enum import Enum, unique


@unique
class SwitchType(Enum):
    EDITOR = 1
    CLIENT = 2
    SERVER = 3


def debug(*switch_type):
    def fun_wrapper(func):
        def wrapper(*args, **kwargs):
            return SwitchTypeFunc(func, *switch_type)(*args, **kwargs)
        return wrapper
    return fun_wrapper

SWITCH_TYPE_MAP = {}
SWITCH_TYPE_MAP[SwitchType.CLIENT] = True


class SwitchTypeFunc(object):

    def __init__(self, func, *switch_type_list):
        assert func and callable(func), 'decorated func must be callable'
        func_name = func.__name__
        assert func_name.startswith('debug_'), 'decorated func must be named debug_xxx'
        self.func = func
        self.switch_type_list = list(switch_type_list)

    @property
    def valid(self):
        for switch_type in self.switch_type_list:
            if SWITCH_TYPE_MAP.get(switch_type):
                return True
        return False

    def __call__(self, *args, **kwargs):
        if self.valid and self.func:
            self.func(*args, **kwargs)
        else:
            print('func:%s in cur switch type invalid' % self.func.__name__)



@debug(SwitchType.CLIENT,)
def debug_print_fun_info(info):
    print(info)

if  __name__ == '__main__':
    name = 'hello_world'
    debug_print_fun_info(name)

有的时候会见到使用lambda来写装饰器,个人觉得不太好理解。不建议。
比如

def debug(*switch_type):
    def fun_wrapper(func):
        def wrapper(*args, **kwargs):
            return SwitchTypeFunc(func, *switch_type)(*args, **kwargs)
        return wrapper
    return fun_wrapper

等价于

def debug(*switch_type):
    def fun_wrapper(func):
        return lambda *args, **kwargs: SwitchTypeFunc(func, *switch_type)(*args, **kwargs)

    return fun_wrapper

相关文章

  • python 装饰器的应用:控制函数是否可用

    在开发中,遇到需求:有很多的调试信息,(1)正常流程不需要,但是本地测试却需要显示(2)正常客户端不需要,编辑器模...

  • Python装饰器9-函数装饰器的应用

    函数装饰器应用场景-权限验证 执行结果: 小结 Python装饰器在Flask中一个典型的应用场景就是权限验证

  • python装饰器

    装饰器简述 要理解装饰器需要知道Python高阶函数和python闭包,Python高阶函数可以接受函数作为参数,...

  • python 装饰器 补充

    重新理解python 装饰器 python 装饰器是一个函数,被装饰器所装饰的代码块最终也是一个函数这个对于一般的...

  • Flask 视图和路由的进阶技能

    视图装饰器 Python 装饰器是用于转换其它函数的函数。当一个装饰的函数被调用的时候,装饰器也会被调用。接着装饰...

  • 解析Python中的装饰器

    python中的函数也是对象,函数可以被当作变量传递。 装饰器在python中功能非常强大,装饰器允许对原有函数行...

  • 理解 Python 装饰器与回调函数

    1.理解 Python 装饰器2.Python装饰器和回调函数回调函数就是一个通过函数指针调用的函数。如果你把函数...

  • 装饰器函数

    在Python有一类特殊的函数,叫装饰器函数。装饰器函数可以在函数的调用的时候,将装饰器的内容注入到函数之中。在定...

  • 函数装饰器(Function Decorators)

    函数装饰器(Function Decorators) python中函数装饰器的使用和Java中注解类似, 直接在...

  • python Decorator (装饰器)

    Python 装饰器Python 装饰器 Decorator 使用kotlin的时候发现有个函数很好玩 measu...

网友评论

      本文标题:python 装饰器的应用:控制函数是否可用

      本文链接:https://www.haomeiwen.com/subject/xutswctx.html