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

Reply via email to