2014-07-02 52 views
2

爲了說明我的問題,這裏不使用contextlib一個基本要求:使用contextlib相同的請求使用urllib.request.urlopen進行請求時,使用contextlib.closing有什麼優勢嗎?

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還是有多餘的優勢?一種方法是Pythonic和/或更常見嗎?

回答

4

contextlib.closing()可用於將支持close()方法的對象轉換爲可與with語句一起使用的上下文管理器。

它不會爲已支持上下文管理器協議的對象添加任何值。

documentationurllib.request.urlopen()解釋說:

對於FTP,文件和數據的URL,並要求明確遺留URLopener和FancyURLopener類處理,這個函數返回一個urllib.response.addinfourl對象可以作爲上下文工作經理

所以在這種情況下,沒有必要將它包裝在closing函數中。

+0

感謝您的快速和明確的迴應。在提問之前,我會更詳細地閱讀文檔。 –

相關問題