2

開いているファイルへの強い参照を保持するクラスがあります。コードが例外なく実行される場合、ファイルを閉じるクラスのメソッドを明示的に呼び出すため、ファイルは正しく閉じられます。ただし、例外がスローされた場合、ファイルは正しく閉じられません。

これが私のコードのモックアップ版です:

class MyFile(object):
    def __init__(self, filename, mode):
        self._handle = open(filename, mode)

    @classmethod
    def open(cls, filename, mode):
        return MyFile(filename, mode)

    def close(self):
        self._handle.close()

    def __del__(self):
        self.close()

    def writerow(data):
        # Special write
        pass

    def __enter__(self):
        return self

    def __exit__(self, *exc_info):
        self.close()

このクラスをコードの最上位で使用する場合、with ステートメントを使用します。

def get_some_dat():
    return 1

with MyFile.open('foo.txt', 'w') as f:
    # do stuff with f
    data = get_some_data()
    f.writerow(data)

ただし、MyFile は別のオブジェクトによって間接的に開かれます。ほとんどの Pythonistas は、ファイルを明示的に閉じる必要があると言うでしょうが、オブジェクトが破棄されたときにファイルが閉じられるようにしたいと思います。私が書いたコードはそのトリックを実行しますが、この動作を実装するためのより良い方法について提案があるかどうか疑問に思っていました.

4

1 に答える 1

2

構文weakrefを使用せずにファイルを開いた場合でも、ファイルを確実に閉じるために使用する例を次に示します。with ...

import weakref

class FileHandler:
    def __init__(self, dbf, caller = None):
        if caller is not None:
            self._ref = weakref.ref(caller, self.close)
        self.thefile = open(dbf, 'rb')
    def __enter__(self):
        return self
    def __exit__(self, ext_type, exc_value, traceback):
        self.close()
    def close(self, *args):
        print('closing file')
        self.thefile.close()

class Foo:
    def __init__(self):
        self.fh = FileHandler('/tmp/testfile', caller = self)

def autoclosing_file():
    foo = Foo()

def demo_callback():
    with open('/tmp/testfile', 'w'): pass
    autoclosing_file()


if __name__ == '__main__':
    demo_callback()

プリント

closing file

PS:このコードは私のものではないと思いますが、どこから来たのかについての言及を失いました。誰かが知っているなら、私が適切な帰属を与えることができるように教えてください。

于 2012-11-12T17:57:22.247 に答える