From: Serhiy Storchaka Date: Thu, 19 Mar 2015 13:23:15 +0000 (+0200) Subject: Issue #23700: Iterator of NamedTemporaryFile now keeps a reference to X-Git-Tag: v3.5.0a3~133^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=56cefa69ee919559cf3ca2388d12371c24402df3;p=thirdparty%2FPython%2Fcpython.git Issue #23700: Iterator of NamedTemporaryFile now keeps a reference to NamedTemporaryFile instance. Patch by Bohuslav Kabrda. --- diff --git a/Lib/tempfile.py b/Lib/tempfile.py index b6eeca3b1a28..8352c38a0d73 100644 --- a/Lib/tempfile.py +++ b/Lib/tempfile.py @@ -426,7 +426,9 @@ class _TemporaryFileWrapper: # iter() doesn't use __getattr__ to find the __iter__ method def __iter__(self): - return iter(self.file) + # don't return iter(self.file), but yield from it to avoid closing + # file as long as it's being used as iterator, see issue #23000 + yield from iter(self.file) def NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None, diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py index 2e10fddae0f4..576cf4d45083 100644 --- a/Lib/test/test_tempfile.py +++ b/Lib/test/test_tempfile.py @@ -707,6 +707,19 @@ class TestNamedTemporaryFile(BaseTestCase): # No reference cycle was created. self.assertIsNone(wr()) + def test_iter(self): + # Issue #23700: getting iterator from a temporary file should keep + # it alive as long as it's being iterated over + lines = [b'spam\n', b'eggs\n', b'beans\n'] + def make_file(): + f = tempfile.NamedTemporaryFile(mode='w+b') + f.write(b''.join(lines)) + f.seek(0) + return f + for i, l in enumerate(make_file()): + self.assertEqual(l, lines[i]) + self.assertEqual(i, len(lines) - 1) + def test_creates_named(self): # NamedTemporaryFile creates files with names f = tempfile.NamedTemporaryFile() diff --git a/Misc/NEWS b/Misc/NEWS index 2ec41cd0c623..2dc6e1c694d5 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -18,6 +18,9 @@ Core and Builtins Library ------- +- Issue #23700: Iterator of NamedTemporaryFile now keeps a reference to + NamedTemporaryFile instance. Patch by Bohuslav Kabrda. + - Issue #22903: The fake test case created by unittest.loader when it fails importing a test module is now picklable.