如何协调上下文管理器与 Jupyter Notebook 的基于单元格的执行风格?

use*_*974 9 python contextmanager jupyter-notebook

像 Jupyter 这样的笔记本将交互式执行分割成单元格。一般来说,这对我来说效果很好,但有一个明显的例外:上下文管理器。如果我打开一条with语句,单元格的末尾将关闭上下文,上下文管理器将退出。

假设我的笔记本处理从 DBMS 获取的数据。我通常会使用上下文管理器来管理与数据库的连接并管理游标以自动提交或回滚事务。但是在建立连接后,我的整个代码需要位于单个单元格中。

解决方法是使用上下文管理器,上下文管理器可以帮助我们防止潜在的陷阱。在我看来,当单元可以(确实)以任何顺序执行时,这个问题在笔记本中会被放大。在我的 DBMS 示例中,由于建立连接的单元被多次执行,因此可以打开与数据库的多个连接而无需关闭。此外,它们甚至可能不是上下文管理器的“内联”版本,例如,当上下文管理器是修饰函数时@contextlib.contextmanager,尽管我没有在我使用的任何主要库中看到这种情况发生。

我可能只是在咆哮,但是有没有办法让上下文管理器单元执行友好?或者我们是否只能使用短命的上下文管理器,否则就只能依靠我们自己?

Ray*_*nda 2

__enter__在单元格中运行上下文管理器类的方法怎么样?

from contextlib import ContextDecorator

class MyContext(ContextDecorator):

   def __init__(self, x):
      self.x = x

   def __enter__(self):
      return self
Run Code Online (Sandbox Code Playgroud)

然后你可以在任何单元格中:

something = MyContext(10).__enter__()
Run Code Online (Sandbox Code Playgroud)

这应该让您的上下文对下一个单元格“开放”。

您可以对基于生成器的上下文管理器使用相同的直觉。

  • 这不是协调笔记本与上下文管理器,这不是完全使用上下文管理器。 (2认同)