文件对象的文档__exit __()方法

时间:2018-01-25 12:06:45

标签: python

在python中查看x2语句的documentation

  
      
  1. 调用上下文管理器的with方法。
  2.   

我想知道如果我这样做会发生什么?

__exit__()

从文档和with open("foo","w") as f: pass 评估为True表明,f.closed似乎有点等同于__exit__()。但我想知道是否还有关于close()函数的实际行为的更多细节。任何提示都表示赞赏。

3 个答案:

答案 0 :(得分:4)

作为一个更具体的答案,open返回_io._IOBase的子类(取决于选项)。 __exit__方法在iobase.c中使用代码

在C中实现
static PyObject *
iobase_exit(PyObject *self, PyObject *args)
{
    return PyObject_CallMethodObjArgs(self, _PyIO_str_close, NULL);
}
你可以看到

,只需调用对象close"方法"。

答案 1 :(得分:2)

任何东西都可以用作上下文管理器 - 它只需要提供自己的__enter____exit__方法。有关with和上下文管理员工作方式的所有详细信息,请参阅PEP343

open的情况下,这实际上是对io.TextIOBase课程的调用。这主要是在C中实现的,但是有一个后备python实现(_pyio.py),它包含以下代码,确认它只调用close()

### Context manager ###

def __enter__(self):  # That's a forward reference
    """Context management protocol.  Returns self (an instance of IOBase)."""
    self._checkClosed()
    return self

def __exit__(self, *args):
    """Context management protocol.  Calls close()"""
    self.close()

答案 2 :(得分:1)

这取决于上下文管理器本身;关键是上下文管理器可以确定退出时要做什么。

mtcars <- data.table(mtcars) ColSelect <- 'cyl' # One Column Option mtcars[, AveMpg := mean(mpg), by = ColSelect] # Should work 的情况下,是的,它关闭文件;但其他情境管理者可以自由地做任何他们喜欢的事情。例如,数据库连接管理器可能会在关闭连接之前提交或回滚游标;或临时文件管理器可能会删除临时文件。