python'with'语句,我应该使用contextlib.closing吗?

 手机用户2602916141 发布于 2023-02-07 23:04

是的,你应该使用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__()在块退出时调用该方法.

1 个回答
  • 是的,你应该使用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__()在块退出时调用该方法.

    2023-02-07 23:30 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有