美文网首页
Decorator装饰器定义可选参数

Decorator装饰器定义可选参数

作者: 蒋狗 | 来源:发表于2016-12-14 17:51 被阅读0次

    一般带参数装饰器。
    使用装饰器时需要加上括号@logged()。
    @logged将会提示参数错误。

    import logging
    logging.basicConfig(level=logging.DEBUG)
    
    
    def logged(level=logging.INFO):
        def decorator(func):
            def wrapper(*args, **kwargs):
                log = logging.getLogger(func.__module__)
                log.log(level, ('execute %s!' % func.__name__))
                return func(*args, **kwargs)
            return wrapper
        return decorator
    
    @logged()
    def add(x, y):
        return x + y
    
    add(1, 1)
    

    利用functools.partial定义可选参数装饰器。
    此时若无参,@logged()和@logged都是可以的。

    from functools import partial
    
    def new_logged(func=None, *, level=logging.INFO):
        if not func:
            return partial(new_logged, level=level)
        def wrapper(*args, **kwargs):
            log = logging.getLogger(func.__module__)
            log.log(level, ('execute %s!' % func.__name__))
            return func(*args, **kwargs)
        return wrapper
    
    @new_logged
    def minus(x, y):
        return x - y
    
    @new_logged(level=logging.WARNING)
    def plus(x, y):
        return x + y
    
    

    对于@new_logged,因为@new_logged后没有(),这时候被装饰函数minus会被作为第一个参数直接传入new_logged装饰器,即new_logged(minus)。

    @new_logged
    def minus(x, y):
        return x - y
    

    相当于:

    def minus(x, y):
        return x - y
    minus = new_logged(minus)
    

    对于@new_logged(),因为@new_logged存在(),这是传入的参数为空,将会执行判断语句返回partial(new_logged, level=level)。

    @new_logged()
    def minus(x, y):
        return x - y
    

    相当于:

    def minus(x, y):
        return x - y
    minus = new_logged()(minus)
    

    对于@new_logged(level=logging.WARNING):即在@new_logged()的基础上传入了参数,第一个func依旧为None,执行判断语句返回partial(new_logged, level=level)。

    @new_logged(level=logging.WARNING)
    def plus(x, y):
        return x + y
    

    相当于:

    def plus(x, y):
        return x + y
    plus = new_logged(level=logging.WARNING)(plus)
    

    相关文章

      网友评论

          本文标题:Decorator装饰器定义可选参数

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