33

私は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()
4

2 に答える 2

47

Python にはブロック スコープがありません。tryブロック内で定義されたものはすべて、外部で使用できます。

とはいえ、まだ問題があります。getConnection()エラーが発生する呼び出しである場合は、cursor定義されていないため、finallyブロック内の参照がエラーになります。

于 2013-06-19T15:48:45.070 に答える
8

次のようなコンテキストを使用することをお勧めします。

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

于 2013-06-19T15:49:29.313 に答える