我試圖編寫一個生成器函數,它從數據庫中獲取行並一次返回一個。但是,我不確定下面標記爲**的清理代碼是否按我的想法執行。如果沒有,最好的方法是將清理代碼放到最後一個yield語句之後執行的生成器中。我看着捕獲StopIteration,但似乎是從調用者完成,而不是在發生器內。運行python生成器清理代碼的最佳方式
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
沒有任何體驗,但你可能想添加'''finally'''子句並將清理放在那裏 - 看起來就是它的目的。 [The ** try ** statement](http://docs.python.org/2.7/reference/compound_stmts.html#the-try-statement) – wwii