gpt4 book ai didi

python - 运行 python 生成器清理代码的最佳方式

转载 作者:太空狗 更新时间:2023-10-30 02:20:57 25 4
gpt4 key购买 nike

我正在尝试编写一个生成器函数,从数据库中获取行并一次返回一个行。但是,我不确定下面标记为 ** 的清理代码是否像我认为的那样执行。如果没有,将清理代码放入在最后一个 yield 语句之后执行的生成器本身的最佳方法是什么?我查看了捕获 StopIteration 但这似乎是从调用者而不是在生成器中完成的。

def MYSQLSelectGenerator(stmt):
...
try:
myDB = MySQLdb.connect(host=..., port=..., user=..., passwd=..., db=...)
dbc=myDB.cursor()
dbc.execute(stmt)
d = "asdf"
while d is not None:
d = dbc.fetchone() #can also use fetchmany() to be more efficient
yield d
dbc.close() #** DOES THIS WORK AS I INTEND, MEANING AS SOON AS d = "None"
except MySQLdb.Error, msg:
print("MYSQL ERROR!")
print msg

最佳答案

只要 d 为 None,您的版本就会运行 dbc.close(),但如果引发异常则不会。你需要一个 finally clause .此版本保证运行dbc.close(),即使出现异常也是如此:

try:   
myDB = MySQLdb.connect(host=..., port=..., user=..., passwd=..., db=...)
dbc = myDB.cursor()
dbc.execute(stmt)
d = "asdf"
while d is not None:
d = dbc.fetchone() #can also use fetchmany() to be more efficient
yield d
except MySQLdb.Error, msg:
print("MYSQL ERROR!")
print msg
finally:
dbc.close()

关于python - 运行 python 生成器清理代码的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19411446/

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