Подтвердить что ты не робот

Использование переменной в try, catch, finally statement без объявления ее вне

Я новичок в 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()
4b9b3361

Ответ 1

Python не имеет области блока. Все, что определено внутри блока try, будет доступно снаружи.

Тем не менее, у вас все еще будет проблема: если это вызов getConnection(), который вызывает ошибку, cursor будет undefined, поэтому ссылка в блоке finally будет ошибочной.

Ответ 2

Я бы предложил использовать контексты, например:

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

Это должно обеспечить закрытие (см. подробнее здесь). В некоторых случаях вам даже не понадобится closing, поскольку соединение, скорее всего, будет поддерживать сам протокол контекста, так что это будет просто with getConnection(database)...