首页 > 其他 > 详细

编写可选参数的装饰器函数

时间:2020-02-03 20:48:39      阅读:58      评论:0      收藏:0      [点我收藏+]

想编写一个装饰器,该装饰器可以不带参数(如@decorator)使用,也可以带可选参数(如@decorator(x,y,z))使用。 但是,由于简单修饰符和带有参数的修饰符之间的调用约定不同,因此似乎没有直接的方法。

以下示例解决了这种编程一致性问题:

from functools import wraps, partial
import logging


def logged(func=None, *, level=logging.DEBUG, name=None, message=None):
    if func is None:
        return partial(logged, level=level, name=name, message=message)
    
    logname = name if name else func.__module__
    log = logging.getLogger(logname)
    logmsg = message if message else func.__name__

    @wraps(func)
    def wrapper(*args, **kwargs):
        log.log(level, logmsg)
        return func(*args, **kwargs)
    return wrapper


# Example use
@logged
def add(x, y):
    return x + y


@logged(level=logging.CRITICAL, name='example')
def spam():
    print('Spam!')

编写可选参数的装饰器函数

原文:https://www.cnblogs.com/jeffrey-yang/p/12256928.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!