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
语句一起使用的上下文管理器

它不会为已经支持上下文管理器协议的对象添加任何值

for
urllib.request.urlopen()
解释:

对于传统URLopener和FancyURLopener类显式处理的ftp、文件和数据URL以及请求,此函数返回一个urllib.response.AddInfo URL对象,该对象可以用作上下文管理器


因此,在这种情况下,没有必要将其包装在
关闭
函数中。

感谢您快速清晰的响应。下次提问之前,我会更彻底地阅读文档。