像朱庇特这样的笔记本电脑将交互执行分解成细胞。一般来说,这对我来说很好,但有一个明显的例外:上下文管理器。如果打开with语句,单元格的结尾将关闭上下文,上下文管理器退出。
假设我的笔记本处理从DBMS获得的数据。我通常使用上下文管理器来管理到数据库的连接,并管理游标来自动提交或回滚事务。但是,在建立连接之后,我的整个代码需要位于一个单元格中。
所做的工作是不使用上下文管理器,这可能是上下文管理器帮助我们防止的。这个问题在笔记本中被放大,当单元格可以(实际上)以任何顺序执行时。在我的DBMS示例中,可以打开到DB的多个连接,而不需要关闭,因为单元格建立了多次执行连接。此外,它们甚至可能不是上下文管理器的“内联”版本,例如,当上下文管理器是一个@contextlib.contextmanager修饰函数时,尽管我没有在我使用的任何主要库中看到这种情况。
我可能只是在咆哮,但有没有办法使上下文管理器单元执行变得友好呢?还是我们只能使用短命的上下文管理器,而不是自己使用呢?
发布于 2020-06-16 19:37:56
如何在单元格中运行上下文管理器类的__enter__方法?
from contextlib import ContextDecorator
class MyContext(ContextDecorator):
def __init__(self, x):
self.x = x
def __enter__(self):
return self你可以在任何牢房里:
something = MyContext(10).__enter__()这将使下一个单元格的上下文“打开”。
对于基于生成器的上下文管理器,您可以使用相同的直觉。
https://stackoverflow.com/questions/59994412
复制相似问题