[Python-checkins] cpython (3.4): Issue #23700: Iterator of NamedTemporaryFile now keeps a reference to

serhiy.storchaka python-checkins at python.org
Thu Mar 19 14:25:25 CET 2015


https://hg.python.org/cpython/rev/7fa741fe9425
changeset:   95060:7fa741fe9425
branch:      3.4
parent:      95057:21e783129c1d
user:        Serhiy Storchaka <storchaka at gmail.com>
date:        Thu Mar 19 15:23:15 2015 +0200
summary:
  Issue #23700: Iterator of NamedTemporaryFile now keeps a reference to
NamedTemporaryFile instance.  Patch by Bohuslav Kabrda.

files:
  Lib/tempfile.py           |   4 +++-
  Lib/test/test_tempfile.py |  13 +++++++++++++
  Misc/NEWS                 |   3 +++
  3 files changed, 19 insertions(+), 1 deletions(-)


diff --git a/Lib/tempfile.py b/Lib/tempfile.py
--- a/Lib/tempfile.py
+++ b/Lib/tempfile.py
@@ -426,7 +426,9 @@
 
     # 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
--- a/Lib/test/test_tempfile.py
+++ b/Lib/test/test_tempfile.py
@@ -707,6 +707,19 @@
             # 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
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -18,6 +18,9 @@
 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.
 

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list