Python中requests库响应对象在if条件中的判断行为问题
requests库HTTPError.response条件判断的坑
核心原因很明确:requests的Response类重写了布尔值转换的逻辑。在Python里,类可以通过__bool__方法(Python2是__nonzero__)自定义实例的真值判断规则,而Response类的规则是:只有状态码属于2xx(成功范围)的响应,布尔值才是True;像404、500这类错误状态的响应,哪怕实例本身不是None,bool(response)也会返回False。
看你的代码:
- 第一个判断
if error.response and error.response.status_code == 404里,error.response是404的响应实例,它的布尔值是False,所以条件直接短路,根本不会去检查后面的状态码,自然打不出"Not Found"。 - 第二个判断
if error.response is not None and ...是直接判断对象是否存在,完全不受Response的布尔规则影响,所以能正常触发判断。
那是不是必须用这种显式判断?没错。因为你要的是“response对象存在”这个前提,而不是“这个响应是成功的”。requests把Response的布尔值和响应成功绑定了,和其他语言里“非空即真”的惯用逻辑不一样,所以必须显式用is not None来判断对象是否存在,才能达到你想要的效果。
内容的提问来源于stack exchange,提问作者vantaboard
相关产品推荐
相关产品推荐

