STINNER Victor added the comment: 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 :-)) ---------- _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue23700> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com