在python中查看x2
语句的documentation:
- 调用上下文管理器的
醇>with
方法。
我想知道如果我这样做会发生什么?
__exit__()
从文档和with open("foo","w") as f:
pass
评估为True表明,f.closed
似乎有点等同于__exit__()
。但我想知道是否还有关于close()
函数的实际行为的更多细节。任何提示都表示赞赏。
答案 0 :(得分:4)
作为一个更具体的答案,open
返回_io._IOBase
的子类(取决于选项)。 __exit__
方法在iobase.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
的情况下,是的,它关闭文件;但其他情境管理者可以自由地做任何他们喜欢的事情。例如,数据库连接管理器可能会在关闭连接之前提交或回滚游标;或临时文件管理器可能会删除临时文件。