私はPythonの初心者ですが、このような自動終了関数を作成しました..
@contextmanager
def AutoClose(obj):
try:
yield obj
finally:
obj.Close()
この関数を使用できる Close() メソッドを持つ 3 つのクラスがあります。これは最も Pythonic なソリューションですか? 代わりに、クラス自体で何かをする必要がありますか?
私はPythonの初心者ですが、このような自動終了関数を作成しました..
@contextmanager
def AutoClose(obj):
try:
yield obj
finally:
obj.Close()
この関数を使用できる Close() メソッドを持つ 3 つのクラスがあります。これは最も Pythonic なソリューションですか? 代わりに、クラス自体で何かをする必要がありますか?
ほとんどの Pythonic ソリューションは、クラスでメソッド__enter__
とメソッドを定義することです。__exit__
class Foo(object):
def __init__(self, filename):
self.filename = filename
def __enter__(self):
self.fd = open(self.filename)
def __exit__(self, exc_type, exc_value, traceback):
self.fd.close()
そして使用:
with Foo('/path/to/file') as foo:
# do something with foo
メソッド__enter__
および__exit__
は、ブロックに出入りするときに暗黙的に呼び出されますwith
。__exit__
また、ブロック内で発生した例外をキャッチできることに注意してくださいwith
。
Functionは通常、メソッドand をcontextlib.closing
明示的に定義しない(しかし method を持つ) クラスに使用されます。独自のクラスを定義する場合、より良い方法はこれらのメソッドを定義することです。__enter__
__exit__
close
あなたがしていることは、完全にうまくPythonicに見えます。ただし、contextlib
標準ライブラリにはすでに似たようなものがありますが、Close
メソッドの名前を に変更する必要がありますclose
。
import contextlib
with contextlib.closing(thing):
print thing
代わりにこれを使用することをお勧めします。結局、Python メソッドの推奨される命名規則はall_lowercase_with_underscores
.