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

2024-06-14 13:59:52 发布

您现在位置:Python中文网/ 问答频道 /正文

像Jupyter这样的笔记本电脑将交互执行拆分为单元。一般来说,这对我来说相当有效,但有一个显著的例外:上下文管理器。如果我打开一个with语句,单元格的末尾将关闭上下文,上下文管理器将退出

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

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

我可能只是在咆哮,但有没有办法让上下文管理器单元执行友好?还是我们必须使用短命的上下文管理器,而不是我们自己


Tags: 数据代码数据库管理器with情况笔记本jupyter
1条回答
网友
1楼 · 发布于 2024-06-14 13:59:52

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

from contextlib import ContextDecorator

class MyContext(ContextDecorator):

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

   def __enter__(self):
      return self

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

something = MyContext(10).__enter__()

这将使您为下一个单元格“打开”上下文

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

相关问题 更多 >