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

NamedTemporaryFile instance.  Patch by Bohuslav Kabrda.
This commit is contained in:
Serhiy Storchaka 2015-03-19 15:24:27 +02:00
commit 4f418d3671
3 changed files with 19 additions and 1 deletions

View File

@ -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,

View File

@ -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()

View File

@ -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.