在try,catch,finally语句中使用变量而不在外部声明它

时间:2013-06-19 15:42:21

标签: python scope

我对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()

2 个答案:

答案 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)...