定义一个带参数的装饰器-python cookbook(第3版)高清中文完整版

时间:2024-06-29 23:06:25
【文件属性】:

文件名称:定义一个带参数的装饰器-python cookbook(第3版)高清中文完整版

文件大小:4.84MB

文件格式:PDF

更新时间:2024-06-29 23:06:25

python cookbook 第3版 高清 中文完整版

9.4 定义一个带参数的装饰器 问题 你想定义一个可以接受参数的装饰器 解决方案 我们用一个例子详细阐述下接受参数的处理过程。 假设你想写一个装饰器,给函数添加 日志功能,当时允许用户指定日志的级别和其他的选项。 下面是这个装饰器的定义和使 用示例: from functools import wraps import logging def logged(level, name=None, message=None): """ Add logging to a function. level is the logging level, name is the logger name, and message is the log message. If name and message aren't specified, they default to the function's module and name. """ def decorate(func): 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 return decorate # Example use @logged(logging.DEBUG) def add(x, y): return x + y @logged(logging.CRITICAL, 'example') def spam(): print('Spam!') 初看起来,这种实现看上去很复杂,但是核心思想很简单。 外层的函数 logged() 接受 参数并将它们作用在内部的装饰器函数上面。 内层的函数 decorate() 接受一个函数作为 参数,然后在函数上面放置一个包装器。 这里的关键点是包装器是可以使用传递给 logged() 的参数的。


网友评论