wrapt 一个方便的python装饰器包,提供了装饰器包装,以及猴子补丁能力,是一个很值得使用的包

一个简单猴子补丁玩法

  • 业务场景

有一个登陆方法,需要进行日志记录,但是不想直接修改原始代码
参考代码
my.py

def login(name,password):
return f"Welcome {name}! Your password is {password}"
  • 基于wrapt的多猴子补丁解决方法
    wra.py
import wrapt
@wrapt.patch_function_wrapper('my', 'login')
def my_wrapper(wrapped, instance, args, kwargs):
    print("Before method",args,kwargs)
    result = wrapped(*args, **kwargs)
    print("After method")
    return result
@wrapt.patch_function_wrapper('my', 'login')
  • 使用

demo2.py 注意顺序很重要,应该先导入包装的,然后是实际要使用的

from wra import *
from my import login
print(login("Alice","1234"))
  • 效果

wrapt 一个方便的python装饰器包_python

说明

wrapt 支持的猴子补丁玩法,对于我们快速进行python 包的调整是很方便的,同时作者github上的一个博客也值得学习下

参考资料

https://github.com/GrahamDumpleton/wrapt
https://wrapt.readthedocs.io/en/master/quick-start.html
https://github.com/GrahamDumpleton/wrapt/blob/develop/blog/11-safely-applying-monkey-patches-in-python.md