像Jupyter这样的笔记本电脑将交互执行拆分为单元。一般来说,这对我来说相当有效,但有一个显著的例外:上下文管理器。如果我打开一个with
语句,单元格的末尾将关闭上下文,上下文管理器将退出
假设我的笔记本处理从DBMS获得的数据。我通常使用上下文管理器来管理与数据库的连接,并管理游标以自动提交或回滚事务。但是,在建立连接之后,我的整个代码需要放在一个单元格中
解决方法是而不是使用上下文管理器,上下文管理器可以帮助我们防止潜在的陷阱。在笔记本电脑中,当单元格可以(实际上是)以任何顺序执行时,问题就更加严重了。在我的DBMS示例中,由于建立连接的单元被多次执行,因此可以在不关闭的情况下打开到DB的多个连接。此外,它们甚至可能不是上下文管理器的“内联”版本,例如,当上下文管理器是一个@contextlib.contextmanager
修饰函数时,尽管我没有看到在我使用的任何主要库中发生这种情况
我可能只是在咆哮,但有没有办法让上下文管理器单元执行友好?还是我们必须使用短命的上下文管理器,而不是我们自己
在单元格中运行上下文管理器类的
__enter__
方法怎么样然后,您可以在任何单元格中:
这将使您为下一个单元格“打开”上下文
对于基于生成器的上下文管理器,您可以使用相同的直觉
相关问题 更多 >
编程相关推荐