Python 使用urllib.request.urlopen发出请求时,使用contextlib.closing是否有优势?
为了说明我的问题,这里有一个不使用Python 使用urllib.request.urlopen发出请求时,使用contextlib.closing是否有优势?,python,python-3.x,urllib,contextmanager,Python,Python 3.x,Urllib,Contextmanager,为了说明我的问题,这里有一个不使用contextlib的基本请求: import urllib.request url = "http://www.example.com/" with urllib.request.urlopen(url) as response: raw_data = response.read() import contextlib import urllib.request url = "http:
contextlib
的基本请求:
import urllib.request
url = "http://www.example.com/"
with urllib.request.urlopen(url) as response:
raw_data = response.read()
import contextlib
import urllib.request
url = "http://www.example.com/"
with contextlib.closing(urllib.request.urlopen(url)) as response:
raw_data = response.read()
使用contextlib
执行相同的请求:
import urllib.request
url = "http://www.example.com/"
with urllib.request.urlopen(url) as response:
raw_data = response.read()
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
是否有好处,或者是多余的?一种方法更具python风格和/或更为常见吗?contextlib.closing()
可用于将支持close()
方法的对象转换为可与with
语句一起使用的上下文管理器
它不会为已经支持上下文管理器协议的对象添加任何值
forurllib.request.urlopen()
解释:
对于传统URLopener和FancyURLopener类显式处理的ftp、文件和数据URL以及请求,此函数返回一个urllib.response.AddInfo URL对象,该对象可以用作上下文管理器
因此,在这种情况下,没有必要将其包装在
关闭
函数中。感谢您快速清晰的响应。下次提问之前,我会更彻底地阅读文档。