Message238617
Ah yes, correct: when a generator using "yield from obj" is destroyed while yield from is not done, obj.close() is called if the method exists.
So "yield from file" *is* different than "for line in file: yield file" when we don't consume the whole generator.
A workaround is to create a wrapper class and returns it in the _TemporaryFileWrapper.__iter__() method:
---
class Iterator:
def __init__(self, obj):
self.obj = obj
def __next__(self):
if self.obj is None:
raise StopIteration
return next(self.obj)
def __iter__(self):
return self
def close(self):
self.obj = None
---
Or simply:
---
class Iterator:
def __init__(self, obj):
self.obj = obj
def __next__(self):
return next(self.obj)
def __iter__(self):
return self
---
This solution looks more complex than tempfile_iter_fix.patch.
@Serhiy: Maybe add a short comment to explain why yield from is not used and must be used. (By the way, the current comment contains "yields from" which is confusing :-)) |
|
Date |
User |
Action |
Args |
2015-03-20 08:40:33 | vstinner | set | recipients:
+ vstinner, georg.brandl, paul.moore, ncoghlan, ethan.furman, python-dev, serhiy.storchaka, bkabrda, sYnfo, wolma |
2015-03-20 08:40:33 | vstinner | set | messageid: <1426840833.59.0.790525472586.issue23700@psf.upfronthosting.co.za> |
2015-03-20 08:40:33 | vstinner | link | issue23700 messages |
2015-03-20 08:40:33 | vstinner | create | |
|