为了说明我的问题,这是一个不使用contextlib
的基本请求:
import urllib.request
url = "http://www.example.com/"
with urllib.request.urlopen(url) as response:
raw_data = response.read()
使用contextlib
的相同请求:
import contextlib
import urllib.request
url = "http://www.example.com/"
with contextlib.closing(urllib.request.urlopen(url)) as response:
raw_data = response.read()
据我所知,这两个请求具有相同的结果:检索数据,代码块完成后请求自动关闭,即使请求关闭后也可以访问raw_data
。使用urllib.request.urlopen
发出请求时,使用contextlib.closing
是否有优势或者是多余的?一种方法是Pythonic和/或更常见吗?
答案 0 :(得分:5)
contextlib.closing()
对于将支持close()
方法的对象转换为可与with
语句一起使用的上下文管理器非常有用。
它不会为已经支持上下文管理器协议的对象添加任何值。
urllib.request.urlopen()
的{{3}}解释了:
对于遗留URLopener和FancyURLopener类显式处理的ftp,文件和数据URL以及请求,此函数返回一个urllib.response.addinfourl对象,该对象可用作上下文管理器
因此,在这种情况下,将它包装在closing
函数中是没有意义的。