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

2023-11-29

我正在尝试编写一个生成器函数,该函数从数据库中获取行并一次返回一行。但是,我不确定下面标记为 ** 的清理代码是否按照我的想法执行。如果没有,将清理代码放入生成器本身并在最后一个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

您的版本将运行dbc.close()立刻d is None, but 如果引发异常则不会。你需要一个finally clause。这个版本是保证 to run 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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

运行 python 生成器清理代码的最佳方法 的相关文章

随机推荐