Nieuws:

We zijn er weer.

Na lange tijd van afwezigheid zijn we er weer  :laugh:
We hebben alle wachtwoorden gereset, je oude wachtwoord werkt niet meer.Je moet via het "wachtwoord vergeten"-linkje je wachtwoord resetten. Je krijgt hiervoor een mailtje op het adres dat je bij ons geregistreerd hebt.

De komende tijd zijn we nog druk bezig om de rest van de site op te bouwen, dus het kan zijn dat sommige onderdelen (tijdelijk) niet werken.

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 401 keer)

Offline MKe

  • Lid
  • Steunpunt: Nee
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
  • Steunpunt: Nee
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....

Offline henkoegema

  • Lid
    • PA2HO
  • Steunpunt: Nee
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://www.henk.oegema.com
Registered linux user 520520.  In gebruik: Ubuntu 18.04.  Radio Amateur callsign: PA2HO Interesses: Raspberry Pi & Arduino