gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:55:17 25 4
gpt4 key购买 nike

from contextlib import closing

def init_db():
with closing(connect_db()) as db:
with app.open_resource('schema.sql') as f:
db.cursor().executescript(f.read())
db.commit()

这是来自 flask 教程第 3 步(http://flask.pocoo.org/docs/tutorial/dbinit/#tutorial-dbinit)。我对其中的第 4 行有点好奇。

我必须导入并使用“contextlib.closing()”方法吗?

当我了解with 语句时,许多文章说它会在如下过程后自动关闭文件。(与Finally: thing.close() 相同)

with open('filename','w') as f:
f.write(someString);

尽管我不像下面那样使用 contextlib.closing(),但有什么区别?它来自 2.7.6 版本,谢谢。

def init_db():
with connect_db() as db:
with app.open_resource('schema.sql') as f:
db.cursor().executescript(f.read())
db.commit()

最佳答案

是的,你应该使用 context.closing();你自己的版本做了完全不同的事情。

with 语句让上下文管理器知道何时进入和退出代码块;在退出时,如果发生异常,上下文管理器也可以访问异常。文件对象使用它在 block 退出时自动关闭文件。

教程中的 connect_db() 函数返回 sqlite3 connection object , 这确实可以用作 context manager . 但是connection.__exit__() 方法不会关闭连接,它会在成功完成时提交事务,或者在成功完成时中止事务有一个异常(exception)。

另一方面,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())

注意第二行 with 中的 , db,确保在 block 退出时调用 db.__exit__() 方法。

关于python 'with' 语句,我应该使用 contextlib.closing 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20793283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com