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

问题描述 投票:1回答:1

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

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

解决的办法是 使用上下文管理器,上下文管理器可以帮助我们防止潜在的陷阱。在笔记本中,当单元格可以(事实上是)以任何顺序执行时,这个问题被放大了IMO。在我的DBMS的例子中,由于建立连接的单元格被多次执行,因此可以打开多个连接到DB而不被关闭。此外,有可能他们的上下文管理器甚至没有一个 "内联 "版本,例如当上下文管理器是一个 "内联 "版本的时候。@contextlib.contextmanager 装饰的函数,尽管我没有在我使用的任何主要库中看到这种情况。

我可能只是在发牢骚,但是有没有一种方法可以让上下文管理器的单元格执行变得友好?还是说我们只能用短命的上下文管理器,否则就只能靠自己了?

python jupyter-notebook contextmanager
1个回答
0
投票

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

from contextlib import ContextDecorator

class MyContext(ContextDecorator):

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

   def __enter__(self):
      return self

那么你可以在任何单元格中使用。

something = MyContext(10).__enter__()

这样你的上下文就可以在下一个单元格中保持 "开放 "状态。

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

© www.soinside.com 2019 - 2024. All rights reserved.