On Thu, Jun 12, 2014, at 18:06, Nikolaus Rath wrote: > Consider this simple example: > > $ cat test.py > import io > import warnings > > class StridedStream(io.IOBase): > def __init__(self, name, stride=2): > super().__init__() > self.fh = open(name, 'rb') > self.stride = stride > > def read(self, len_): > return self.fh.read(self.stride*len_)[::self.stride] > > def close(self): > self.fh.close() > > class FixedStridedStream(StridedStream): > def __del__(self): > # Prevent IOBase.__del__ frombeing called. > pass > > warnings.resetwarnings() > warnings.simplefilter('error') > > print('Creating & loosing StridedStream..') > r = StridedStream('/dev/zero') > del r > > print('Creating & loosing FixedStridedStream..') > r = FixedStridedStream('/dev/zero') > del r > > $ python3 test.py > Creating & loosing StridedStream.. > Creating & loosing FixedStridedStream.. > Exception ignored in: <_io.FileIO name='/dev/zero' mode='rb'> > ResourceWarning: unclosed file <_io.BufferedReader name='/dev/zero'> > > In the first case, the destructor inherited from IOBase actually > prevents the ResourceWarning from being emitted.
Ah, I see. I don't see any good ways to fix it, though, besides setting some flag if close() is called from __del__. _______________________________________________ Python-Dev mailing list Python-Dev@python.org https://mail.python.org/mailman/listinfo/python-dev Unsubscribe: https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com