pythonでのwithの使い方


ちょうどpythonを学び始めて、今日1つの基礎の例の中で1行のコードを見て、とても面白いと思って、研究に行きました
with open("../config/name_login.txt",'r') as f:

実はこれはpythonのwith文で、phpのtry()に似ています......catch()は、主にファイル処理に使用されています.必要なのはファイルハンドルを取得し、ファイルからデータを読み出し、データを処理し、最後にファイルを閉じてphpでこのように書くことができます.

    $filename = "/usr/local/something.txt";
        $handle = fopen($filename, "r");
        $contents = fread($handle, filesize ($filename));
        fclose($handle);
?>

これは比較的簡単な例であり,通常try(),catch()を用いて異常を処理する.

    try {
        $filename = "/usr/local/something.txt";
        $handle = fopen($filename, "r");
        $contents = fread($handle, filesize ($filename));
        fclose($handle);
    } catch (Exception $e) {
        print (error);
        exit();
    }
?>

pythonのwith文を勉強した後、このコードは本当に冗長すぎることに気づきます............
では、with文はどのように働いているのでしょうか.
他の人の言い方を借りる:
withの直後の文が評価されると、オブジェクトを返すenter()メソッドが呼び出され、このメソッドの戻り値はasの後ろの変数に割り当てられます.withの後のコードブロックがすべて実行されると、前に返されるオブジェクトのexit()メソッドが呼び出されます.
次の例では、withがどのように動作するかを具体的に説明します.
#!/usr/bin/env python
# with_example01.py
class Sample:
    def __enter__(self):
        print "In __enter__()"
        return "Foo"
    def __exit__(self, type, value, trace):
        print "In __exit__()"
def get_sample():
    return Sample()
with get_sample() as sample:
    print "sample:", sample

コードを実行し、次のように出力します.
bash-3.2$ ./with_example01.py
In __enter__()
sample: Foo
In __exit__()

ご覧の通り:1.enter()メソッドが実行する.enter()メソッドが返す値-この例では「Foo」であり、変数「sample」3に値を与える.コードブロックを実行する、印刷変数sampleの値は「Foo」4.exit()メソッドが呼び出されます
ここを見るとphpの構造方法と析構方法に似ていると思いますが、あなたは感じていますか??
withの基本的な使い方を見た後、コンテキストマネージャという用語を導入します.
with文を使用するには、まずコンテキストマネージャという概念を理解する必要があります.コンテキストマネージャがあればwith文が機能します.コンテキストマネージャとwith文に関する概念のセットを次に示します.コンテキスト管理プロトコル(Context Management Protocol):メソッドenter()とexit()を含み、このプロトコルをサポートするオブジェクトがこの2つのメソッドを実装します.Context Manager(Context Manager):enter()メソッドとexit()メソッドを実装するコンテキスト管理プロトコルをサポートするオブジェクト.コンテキストマネージャはwith文を実行するときに確立する実行時コンテキストを定義し、with文ブロックコンテキストでのアクセスと終了操作を実行します.通常はwith文を使用してコンテキストマネージャを呼び出すか、直接呼び出す方法で使用できます.ランタイムコンテキスト(runtime context):コンテキストマネージャによって作成され、コンテキストマネージャのenter()メソッドとexit()メソッドによって実現され、enter()メソッドは文体が実行される前にランタイムコンテキストに入り、exit()は文体が実行された後にランタイムコンテキストから終了します.with文は、ランタイムコンテキストという概念をサポートします.コンテキストエクスプレッション(Context Expression):コンテキストマネージャオブジェクトを返すキーワードwithの後に続くwith文のエクスプレッション.文体(with-body):with文に包まれたコードブロックは、文体を実行する前にコンテキストマネージャのenter()メソッドを呼び出し、文体を実行した後にexit()メソッドを実行します.
関連リンク:1.http://blog.kissdata.com/2014/05/23/python-with.html 2.https://www.ibm.com/developerworks/cn/opensource/os-cn-pythonwith/ 3.http://blog.csdn.net/bitcarmanlee/article/details/52745676