3

为了说明我的问题,这是一个不使用的基本请求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 和/或更常见?

4

1 回答 1

6

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

它对已经支持上下文管理器协议的对象没有任何价值。

文档解释urllib.request.urlopen()

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

closing所以在这种情况下,将它包装在一个函数中是没有意义的。

于 2014-07-02T17:59:38.650 回答