7

私はPythonの初心者ですが、このような自動終了関数を作成しました..

@contextmanager
def AutoClose(obj):
    try:
        yield obj
    finally:
        obj.Close()

この関数を使用できる Close() メソッドを持つ 3 つのクラスがあります。これは最も Pythonic なソリューションですか? 代わりに、クラス自体で何かをする必要がありますか?

4

2 に答える 2

12

ほとんどの 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

于 2013-08-12T06:51:56.547 に答える
8

あなたがしていることは、完全にうまくPythonicに見えます。ただし、contextlib標準ライブラリにはすでに似たようなものがありますが、Closeメソッドの名前を に変更する必要がありますclose

import contextlib
with contextlib.closing(thing):
    print thing

代わりにこれを使用することをお勧めします。結局、Python メソッドの推奨される命名規則はall_lowercase_with_underscores.

于 2013-08-12T06:36:57.250 に答える