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()

私が知る限り、これら 2 つのリクエストの結果は同じです。データが取得され、コード ブロックの完了時にリクエストが自動的に閉じraw_dataられ、リクエストが閉じられた後でもアクセス可能です。を使用してリクエストを行う場合、使用urllib.request.urlopenする利点はありcontextlib.closingますか、それとも冗長ですか? 1つのアプローチは、より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 に答える