diff --git a/Lib/_pyio.py b/Lib/_pyio.py index 43c24342ad6162..0b6493bc8dc926 100644 --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -405,6 +405,16 @@ def close(self): def __del__(self): """Destructor. Calls close().""" + try: + closed = self.closed + except Exception: + # If getting closed fails, then the object is probably + # in an unusable state, so ignore. + return + + if closed: + return + if _IOBASE_EMITS_UNRAISABLE: self.close() else: diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 3a1f5ba5b6663d..55686d74398355 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -277,6 +277,10 @@ def readable(self): def seekable(self): return True + def seek(self, pos, whence=0): + # naive implementation, enough for tests + return 0 + def writable(self): return True @@ -1486,6 +1490,9 @@ def test_misbehaved_io(self): self.assertRaises(OSError, bufio.seek, 0) self.assertRaises(OSError, bufio.tell) + # Silence destructor error + bufio.close = lambda: None + def test_no_extraneous_read(self): # Issue #9550; when the raw IO object has satisfied the read request, # we should not issue any additional reads, otherwise it may block @@ -1834,6 +1841,9 @@ def test_misbehaved_io(self): self.assertRaises(OSError, bufio.tell) self.assertRaises(OSError, bufio.write, b"abcdef") + # Silence destructor error + bufio.close = lambda: None + def test_max_buffer_size_removal(self): with self.assertRaises(TypeError): self.tp(self.MockRawIO(), 8, 12) @@ -2060,6 +2070,11 @@ def writer_close(): # Silence destructor error writer.close = lambda: None + writer = None + + with support.catch_unraisable_exception(): + pair = None + support.gc_collect() def test_reader_writer_close_error_on_close(self): def reader_close(): diff --git a/Misc/NEWS.d/next/Library/2019-06-11-01-54-19.bpo-18748.ADqCkq.rst b/Misc/NEWS.d/next/Library/2019-06-11-01-54-19.bpo-18748.ADqCkq.rst new file mode 100644 index 00000000000000..295ddebb2a4015 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-11-01-54-19.bpo-18748.ADqCkq.rst @@ -0,0 +1,2 @@ +:class:`_pyio.IOBase` destructor now does nothing if getting the ``closed`` +attribute fails to better mimick :class:`_io.IOBase` finalizer. pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy