6

我' .get '一个请求并处理响应,如:

resp = requests.get('url')
resp = resp.text
.. # do stuff with resp

在阅读了包的文档后,我看到有一个钩子功能可以让我这样做:

def process_r(resp, **kwargs): .. do stuff with resp

resp = requests.get('url', hooks = {'response': process_r})

我的问题:

我什么时候应该使用钩子?或者,我为什么要使用钩子?

我希望在使用请求过程返回请求的响应后启动一个对象(解析器)resp.text

对于这种情况,Pythonic 的正确方法是什么?

谢谢

4

1 回答 1

11

钩子距离“魔法”不是一百万英里。它们的效果是使您的代码可能会做一些让其他人感到惊讶的事情(从而违反“显式优于隐式”)。

因此,钩子实际上应该只用于驱动使事情可预测的行为,而不是更少。例如,Requests 在内部使用它们来处理各种身份验证的401 响应。

因此,您应该遵循对钩子的限制。文档的相关部分指出钩子需要返回一个Response对象。这会导致一些明显的可能行为:您可以提出额外的请求(如上面的 401 挂钩),或者您可以Response以某种方式改变。

启动解析器正是你不应该用钩子做的事情。它应该是您业务逻辑的一部分。我会写一个实用程序函数。

于 2013-07-21T17:48:03.860 回答