使用urllib.request.urlopen发出请求时使用contextlib.closing是否有优势?

时间:2014-07-02 17:57:21

标签: 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()

使用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和/或更常见吗?

1 个答案:

答案 0 :(得分:5)

contextlib.closing()对于将支持close()方法的对象转换为可与with语句一起使用的上下文管理器非常有用。

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

urllib.request.urlopen()的{​​{3}}解释了:

  

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

因此,在这种情况下,将它包装在closing函数中是没有意义的。