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