いいえ、最初のファイルが閉じていることを除いて、全く同じです。第二はしません。言い換えれば、with
ステートメントの本文内では、f
は、2番目のコードスニペットでopen
を呼び出した後に取得するf
オブジェクトとまったく同じファイルオブジェクトです。
あなたが知っている(とそうでない場合は、the informative docを読んでください)かもしれませんが、with
文はコンテキストマネージャインターフェイスを実装し、エントリ上のオブジェクトの__enter__
メソッドを呼び出すオブジェクトを受け取り、その__exit__
方法だから
{"__enter__", (PyCFunction)file_self, METH_NOARGS, enter_doc},
{"__exit__", (PyCFunction)file_exit, METH_VARARGS, exit_doc},
、T:それは自然かどうか、または例外を除いて(完了だ
は、ソースコード(
Objects/fileobject.c
)を見ると、ここではこれらの特別なメソッドのマッピング(
file_methods
構造の一部)です
static PyObject *
file_exit(PyObject *f, PyObject *args)
{
PyObject *ret = PyObject_CallMethod(f, "close", NULL);
if (!ret)
/* If error occurred, pass through */
return NULL;
Py_DECREF(ret);
/* We cannot return the result of close since a true
* value will be interpreted as "yes, swallow the
* exception if one was raised inside the with block". */
Py_RETURN_NONE;
}
あなたは第二ケースをインデントしてはならない。その
__exit__
方法は、ファイルを閉じている間:彼は、オブジェクトの
__enter__
方法は、単にファイルオブジェクト自体を返しますファイル。 2番目のケースは 'f.close()'がなければ完了しません – joaquin