python的wrapt模块实现装饰器
2024-10-20 03:11:25
wrapt是一个功能非常完善的包,用于实现各种你想到或者你没想到的装饰器。使用wrapt实现的装饰器你不需要担心之前inspect中遇到的所有问题,因为它都帮你处理了,甚至inspect.getsource(func)也准确无误。
import wrapt
# without argument in decorator
@wrapt.decorator
def logging(wrapped, instance, args, kwargs): # instance is must
print "[DEBUG]: enter {}()".format(wrapped.__name__)
return wrapped(*args, **kwargs)
@logging
def say(something): pass
使用wrapt你只需要定义一个装饰器函数,但是函数签名是固定的,必须是(wrapped, instance, args, kwargs),注意第二个参数instance是必须的,就算你不用它。当装饰器装饰在不同位置时它将得到不同的值,比如装饰在类实例方法时你可以拿到这个类实例。根据instance的值你能够更加灵活的调整你的装饰器。另外,args和kwargs也是固定的,注意前面没有星号。在装饰器内部调用原函数时才带星号。
如果你需要使用wrapt写一个带参数的装饰器,可以这样写。
def logging(level):
@wrapt.decorator
def wrapper(wrapped, instance, args, kwargs):
print "[{}]: enter {}()".format(level, wrapped.__name__)
return wrapped(*args, **kwargs)
return wrapper
@logging(level="INFO")
def do(work): pass
官方文档: http://wrapt.readthedocs.io/en/latest/quick-start.html
最新文章
- React-Native坑:Invariant Violation:Application 项目名 has not been registered.
- iOS delegate
- mod_rewrite
- MySQLdb callproc 方法
- MySQL(九)之数据表的查询详解(SELECT语法)二
- 工具:Entity Framework Profiler
- 在WebStorm里配置watcher实现编辑less文件时自动生成.map和压缩后的.css文件
- 结合JDK源码看设计模式——策略模式
- Python 代码片段整理
- 将VSCode添加到右键
- POJ 1904 King&;#39;s Quest(强连通)
- Unity AssetBoundle 打包流程
- ico 图标 生成 工具 网站
- heat 用法 示例
- [ python ] 学习目录大纲
- Android的/system/lib里加入自己的so库
- InnoDB索引概述,二分查找法,平衡二叉树
- CentOS7.6打开的程序窗口居中
- Mysql中字段类型之时间戳大坑
- 【洛谷P3818】小A和uim之大逃离 II