diff --git a/Lib/gzip.py b/Lib/gzip.py index 7e384f8a568c1c..91632b1c05216c 100644 --- a/Lib/gzip.py +++ b/Lib/gzip.py @@ -193,6 +193,11 @@ def __init__(self, filename=None, mode=None, """ + # Ensure attributes exist at __del__ + self.mode = None + self.fileobj = None + self._buffer = None + if mode and ('t' in mode or 'U' in mode): raise ValueError("Invalid mode: {!r}".format(mode)) if mode and 'b' not in mode: @@ -358,7 +363,9 @@ def closed(self): def close(self): fileobj = self.fileobj - if fileobj is None or self._buffer.closed: + if fileobj is None: + return + if self._buffer is None or self._buffer.closed: return try: if self.mode == WRITE: @@ -435,6 +442,13 @@ def readline(self, size=-1): self._check_not_closed() return self._buffer.readline(size) + def __del__(self): + if self.mode == WRITE and not self.closed: + import warnings + warnings.warn("unclosed GzipFile", + ResourceWarning, source=self, stacklevel=2) + + super().__del__() def _read_exact(fp, n): '''Read exactly *n* bytes from `fp` diff --git a/Lib/test/test_gzip.py b/Lib/test/test_gzip.py index 0940bb114df625..7047220900f827 100644 --- a/Lib/test/test_gzip.py +++ b/Lib/test/test_gzip.py @@ -9,6 +9,7 @@ import struct import sys import unittest +import warnings from subprocess import PIPE, Popen from test.support import catch_unraisable_exception from test.support import import_helper @@ -867,9 +868,10 @@ def test_refloop_unraisable(self): # fileobj would be closed before the GzipFile as the result of a # reference loop. See issue gh-129726 with catch_unraisable_exception() as cm: - gzip.GzipFile(fileobj=io.BytesIO(), mode="w") - gc.collect() - self.assertIsNone(cm.unraisable) + with self.assertWarns(ResourceWarning): + gzip.GzipFile(fileobj=io.BytesIO(), mode="w") + gc.collect() + self.assertIsNone(cm.unraisable) class TestOpen(BaseTest): diff --git a/Misc/NEWS.d/next/Library/2025-03-05-20-02-21.gh-issue-130806.o0l2FJ.rst b/Misc/NEWS.d/next/Library/2025-03-05-20-02-21.gh-issue-130806.o0l2FJ.rst new file mode 100644 index 00000000000000..37c3d12549eb91 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-03-05-20-02-21.gh-issue-130806.o0l2FJ.rst @@ -0,0 +1,2 @@ +Deleting :class:`gzip.GzipFile` before it is closed now emits a +:exc:`ResourceWarning`.