是的,你应该使用context.closing()
; 你自己的版本完全不同.
该with
语句允许上下文管理器知道何时输入和退出代码块; 退出时,如果发生异常,则还可以访问上下文管理器.文件对象使用此选项在退出块时自动关闭文件.
本connect_db()
教程中的函数返回一个sqlit3
连接对象,该对象确实可以用作上下文管理器.但是,该connection.__exit__()
方法不会关闭连接,它会在成功完成时提交事务,或者在发生异常时中止事务.
在contextlib.closing()
另一方面上下文管理器,调用connection.close()
的连接方法.这是完全不同的东西.
所以,你的第二个片段可能有效,但做了不同的事情.教程代码关闭连接,您的版本提交事务.您已经在调用db.commit()
,因此如果没有引发异常,操作实际上是多余的.
您可以再次使用连接作为上下文管理器来实现自动事务处理行为:
def init_db(): with closing(connect_db()) as db: with app.open_resource('schema.sql') as f, db: db.cursor().executescript(f.read())
请注意, db
第二with
行,确保db.__exit__()
在块退出时调用该方法.
是的,你应该使用context.closing()
; 你自己的版本完全不同.
该with
语句允许上下文管理器知道何时输入和退出代码块; 退出时,如果发生异常,则还可以访问上下文管理器.文件对象使用此选项在退出块时自动关闭文件.
本connect_db()
教程中的函数返回一个sqlit3
连接对象,该对象确实可以用作上下文管理器.但是,该connection.__exit__()
方法不会关闭连接,它会在成功完成时提交事务,或者在发生异常时中止事务.
在contextlib.closing()
另一方面上下文管理器,调用connection.close()
的连接方法.这是完全不同的东西.
所以,你的第二个片段可能有效,但做了不同的事情.教程代码关闭连接,您的版本提交事务.您已经在调用db.commit()
,因此如果没有引发异常,操作实际上是多余的.
您可以再次使用连接作为上下文管理器来实现自动事务处理行为:
def init_db(): with closing(connect_db()) as db: with app.open_resource('schema.sql') as f, db: db.cursor().executescript(f.read())
请注意, db
第二with
行,确保db.__exit__()
在块退出时调用该方法.