编程语言
首页 > 编程语言> > Python:Monkeypatching一个对象的方法

Python:Monkeypatching一个对象的方法

作者:互联网

我正在通过请求的Session类在python中访问API.我正在制作GET&使用requests.Session()调用POST方法.

在每次调用(GET / POST)失败时,我想通知另一个进程.我可以通过创建如下的实用程序方法来完成此操作:

s = request.Session()
def post():
    try:
        s.post(URL,data,headers)
    except:
        notify_another_process()

并调用此方法而不是requests.Session().直接发布.

但是,我想将这个代码monkeypatch到requests.Session().发布并希望在requests.Session().post方法调用本身中通知其他进程的附加功能.我怎样才能做到这一点?

编辑1:

requests.Session()的post方法具有以下签名:

def post(self, url, data=None, json=None, **kwargs):
    return self.request('POST', url, data=data, json=json, **kwargs)

如果我以某种方式尝试使我的自定义帖子如下:

def post_new(self, url, data=None, json=None, **kwargs):
    try:
        s.post(url,data, json,kwargs)
    except:
        notify_another_process()

并做一个补丁如下:

requests.post = post_new

这不是一个很好的monkeypatching因为我没有使用self而是session.post中的session对象.

解决方法:

这应解决这个问题.您基本上使用不同的名称保存旧功能,并将您的功能作为默认帖子.

setattr(requests, 'old_post', requests.post)

def post(url, data=None, json=None, **kwargs):
    try:
        requests.old_post(url, data, json, kwargs)
    except:
        notify_another_process()

setattr(requests, 'post', post)

标签:python-decorators,python,monkeypatching
来源: https://codeday.me/bug/20190828/1755843.html