根据source of the Requests module,__bool__
函数仅用于检查响应的状态代码是否介于200和400之间。
Returns True if :attr:`status_code` is less than 400.
This attribute checks if the status code of the response is between
400 and 600 to see if there was a client error or a server error. If
the status code, is between 200 and 400, this will return True. This
is **not** a check to see if the response code is ``200 OK``.
__bool__
函数的使用使得下面的代码不能按预期工作:
def request_url(url):
error_message = None
try:
r = requests.get(url)
except:
# Do some other error handling...
error_message = "Bad request."
r = None
return r, error_message
r, error_message = request_url(url)
if r:
# Do some stuff to the response
operate_on_response(r)
else:
# Skip this response object and move to the next.
当我请求的url的状态代码为500时,语句if r:
返回False。即使未触发异常,每次出现服务器错误时if r:
都会返回False
。我的目的是测试响应对象是否存在。
我不是要求解决方法:我知道我可以检查error_message是否不是None
。上面的代码只是一个例子,而不是我正在使用的实际代码。
但是,对我来说,使用__bool__
函数检查状态代码是否在两个值之间似乎并不自然或合乎逻辑。就像我说的,我自己可以找到一个解决方法,但我主要是问为什么?为什么这样使用__bool__
方法?是否有一些我没有看到的逻辑?
答案 0 :(得分:8)
如果请求成功,则该方法返回True
。 2xx和3xx范围内的状态代码均表示正确且成功的响应,而其他状态代码均表示错误。
在幕后,__bool__
方法基本上是response.ok
attribute的别名:
如果
True
小于400,则返回status_code
,否则返回False
。此属性检查响应的状态代码是否介于400和600之间,以查看是否存在客户端错误或服务器错误。如果状态代码介于200和400之间,则返回
True
。这是不检查响应代码是否为200 OK。
这与response.raise_for_status()
method相呼应,当出现“错误”时会引发HTTPError
例外情况。状态代码。
requests
API中可以返回Response
个实例的任何函数或方法,总是这样做,或者引发异常。您无法从API获得None
或其他false-y值,因此没有其他用于测试布尔值的用例。因此,响应的布尔值可以被重载为任何,并且在这里它用于使得容易测试' okayness'回复:
response = requests.get(...)
if response:
# success! yay, do something meaningful with the response data
这适用于某些用例,而不是为相反的状态引发异常,从服务器获取错误状态。