1

Python の最近のバージョンでwith open('abc.txt') as f:は、次の (インデントされた) コード ブロックで例外が発生した場合でも、ファイルが閉じられることを保証するようなものを使用できます。この手法が cx_Oracle 接続オブジェクトでも機能するかどうか疑問に思っていました。たとえば、次のコード ブロックでエラーが発生した場合にデータベース接続が確実に閉じられるようにするには、次のようにします。

with cx_Oracle.connect('uname/pwd@schema.db') as conn:
  c = conn.Cursor()
  c.execute("Select * from table1")
  #...etc

現在、try...except...finally を使用してこれを達成できますが、私は with...as テクニックを好みます。

4

2 に答える 2

8

はい、オブジェクトConnectionは context manager として機能できます

于 2012-06-22T19:09:50.307 に答える
4

Connection オブジェクト自体がそれを行わなかったとしても (どうやらそうしているようです)、メソッドが提供されている限り、contextlib.closing.close()を使用して独自のラッパーを簡単に作成できます。

>>> from contextlib import closing
>>> 
>>> class FakeC(object):
...     def close(self):
...         print 'closing!'
...     def execute(self, cmd):
...         print cmd
... 
>>> with closing(FakeC()) as c:
...     c.execute("fred")
...     raise Exception("something went wrong!")
... 
fred
closing!
Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
Exception: something went wrong!

他のバリエーションもほぼ同じくらい簡単です。

[「はい!」の前に上記を書きました。回答が投稿され、とにかく公開することにしました。]

于 2012-06-22T19:14:19.630 に答える