Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: Python 2.7: With statement voor eigen class (__exit__ functie)  (gelezen 868 keer)

Offline MKe

  • Lid
Hoi,

Ik ben een class aan het schrijven die gebruikt kan worden om een iterator zich te laten gedragen als een readonly file object. Een groot gedeelte werkt al, maar ik het lukt me niet om het te laten werken met het 'with statement. Ik weet dat de class daarvoor een __enter__ en een __exit__ functie nodig heeft, maar het lukt me niet om dat te laten werken.
Mijn class:
class IterStreamer(object):
    """
    File-like streaming iterator.
    """
    def __init__(self, generator):
        self.generator = generator
        self.iterator = iter(generator)
        self.leftover = ''

    def __len__(self):
        return self.generator.__len__()

    def __iter__(self):
        return self.iterator

    def next(self):
        return self.iterator.next()

    def read(self, size):
        data = self.leftover
        count = len(self.leftover)
        try:
            while count < size:
                chunk = self.next()
                data += chunk
                count += len(chunk)
        except StopIteration, e:
            self.leftover = ''
            return data

        if count > size:
            self.leftover = data[size:]

        return data[:size]
    def __enter__(self):
        return self
    def __exit__(self, type, value, traceback):
        return True

Ik krijg dan het volgende:
with testiter(10) as f:
    for r in f:
        print r

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-27-de69c6c119a9> in <module>()
----> 1 with testiter(10) as f:
      2     for r in f:
      3         print r

AttributeError: __exit__


Maar er is toch een __exit__ functie??? Wat doe ik fout?

Offline MKe

  • Lid
Re: Python 2.7: With statement voor eigen class (__exit__ functie)
« Reactie #1 Gepost op: 2015/07/16, 10:42:50 »
Mijn eigen code lezen voordat ik wat vraag is wel een goed idee. Het stomme is dat ik er blijkbaar blind voor geworden was. Maar de fout is heel erg stom.

with testiter(10) as f:
    for r in f:
        print r

Moet natuurlijk zijn:
with IterStreamer(testiter(10)) as f:
    for r in f:
        print r

Anders maak je natuurlijk geen gebruik van het object....

Ach, weer een stuk van mijn leven verspeelt aan dommigheid....

Re: Python 2.7: With statement voor eigen class (__exit__ functie)
« Reactie #2 Gepost op: 2015/07/17, 13:53:07 »
Mijn eigen code lezen voordat ik wat vraag is wel een goed idee. Het stomme is dat ik er blijkbaar blind voor geworden was. Maar de fout is heel erg stom.
...................................
...................................
Ach, weer een stuk van mijn leven verspeelt aan dommigheid....

Gebeurt mij ook regelmatig.   :D
En toch leer ik er een hoop van. 
Miscere utile dulci. (Ter leering ende vermaeck)
http://henk.oegema.com  (Op RaspberryPi2)
Registered linux user 520520.  In gebruik: Ubuntu  22.04.4 Hobby's: Radio Amateur callsign: PA2HO.  Interesses: Raspberry Pi & Arduino & Jetson Nano (voor AI & ML)