Kaydet (Commit) 56cefa69 authored tarafından Serhiy Storchaka's avatar Serhiy Storchaka

Issue #23700: Iterator of NamedTemporaryFile now keeps a reference to

NamedTemporaryFile instance.  Patch by Bohuslav Kabrda.
üst 86fdbf31
...@@ -426,7 +426,9 @@ class _TemporaryFileWrapper: ...@@ -426,7 +426,9 @@ class _TemporaryFileWrapper:
# iter() doesn't use __getattr__ to find the __iter__ method # iter() doesn't use __getattr__ to find the __iter__ method
def __iter__(self): 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, def NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None,
......
...@@ -707,6 +707,19 @@ class TestNamedTemporaryFile(BaseTestCase): ...@@ -707,6 +707,19 @@ class TestNamedTemporaryFile(BaseTestCase):
# No reference cycle was created. # No reference cycle was created.
self.assertIsNone(wr()) 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): def test_creates_named(self):
# NamedTemporaryFile creates files with names # NamedTemporaryFile creates files with names
f = tempfile.NamedTemporaryFile() f = tempfile.NamedTemporaryFile()
......
...@@ -18,6 +18,9 @@ Core and Builtins ...@@ -18,6 +18,9 @@ Core and Builtins
Library 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 - Issue #22903: The fake test case created by unittest.loader when it fails
importing a test module is now picklable. importing a test module is now picklable.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment