我对Python很陌生,这里有一些我正在看的代码:
try:
connection = getConnection(database)
cursor = connection.cursor()
cursor.execute("some query")
except:
log.error("Problem.")
raise
finally:
cursor.close()
connection.close()
这是否正确清理?在我写的其他语言中,我习惯做这样的事情:
connection = None
cursor = None
try:
connection = getConnection(database)
cursor = connection.cursor()
cursor.execute("some query")
except:
log.error("Problem.")
raise
finally:
if cursor is not None:
cursor.close()
if connection is not None:
connection.close()
答案 0 :(得分:39)
Python没有块范围。 try
块内定义的任何内容都可以在外面找到。
也就是说,您仍然会遇到问题:如果是getConnection()
调用引发了错误,cursor
将是未定义的,因此finally
块中的引用将出错
答案 1 :(得分:7)
我建议使用上下文,例如:
from contextlib import closing
try:
with closing(getConnection(database)) as connection:
with closing(connection.cursor()) as cursor:
cursor.execute("some query")
except:
log.error("Problem")
raise
这应确保结束(见more here)。
在某些情况下,您甚至不需要closing
因为连接最有可能支持上下文协议本身,所以这只是with getConnection(database)...