如何找出内置__exit__中发生的事情?

时间:2016-02-02 18:52:36

标签: python with-statement contextmanager

一个例子是python的file.__exit__(即除了关闭之外它还做了什么)。这记录在哪里?我尝试使用谷歌搜索,但没有找到好的结果。

1 个答案:

答案 0 :(得分:3)

Python的内置函数和类型是用C语言编写的(在参考实现中,CPython)。如果需要,您可以阅读其源代码。对于你要问的__exit__方法,在Python 3中,我认为你正在寻找文件Modules/_io/iobase.c

static PyObject *
iobase_exit(PyObject *self, PyObject *args)
{
    return PyObject_CallMethodObjArgs(self, _PyIO_str_close, NULL);
}

看起来除了致电close之外什么都不做。

Python 2的等效代码位于不同的文件中,因为它仍然使用自己的IO类(而不是IO模块,它也可以作为Python 3的后端)。查看Objects/fileobject.c

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;
}

我不确定为什么这段代码需要对{3}代码不需要的None进行测试,但你仍然可以看到它除了调用close之外什么都不做(并忽略其返回值)。