Eigener Context Manager

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Judge
User
Beiträge: 129
Registriert: Mittwoch 13. Juni 2012, 22:27
Wohnort: Ratingen
Kontaktdaten:

Hallo zusammen,

ich möchte gerne einen eigenen Context Manager schreiben, bekomme aber selbst im simpelst möglichem Beispiel einen AttributeError:

Code: Alles auswählen

class Demo:
    def __enter__(self):
        print("ENTER")
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("EXIT")


with Demo:
    print("Inbetween")
Ich erwarte hierbei folgende Ausgabe zu bekommen; das dieser Context Manager keinen Sinn ergibt ist mir dabei klar:

Code: Alles auswählen

ENTER
Inbetween
EXIT
Stattdessen bekomme ich jedoch:

Code: Alles auswählen

Traceback (most recent call last):
  File "<input>", line 10, in <module>
AttributeError: __enter__
Was mache ich falsch?

LG,
Marc
Sirius3
User
Beiträge: 18257
Registriert: Sonntag 21. Oktober 2012, 17:20

Du mußt schon eine Instanz von `Demo` erzeugen.
Benutzeravatar
__blackjack__
User
Beiträge: 14016
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Und hier noch eine Variante das ohne Klasse zu schreiben:

Code: Alles auswählen

from contextlib import contextmanager


@contextmanager
def demo():
    print("ENTER")
    try:
        yield
    finally:
        print("EXIT")


with demo():
    print("Inbetween")
Das erstellt nicht nur einen Kontextmanager, man kann den sogar zusätzlich noch als Decorator verwenden wenn das ``with`` den gesamten Körper einer Funktion umfassen würde:

Code: Alles auswählen

from contextlib import contextmanager


@contextmanager
def demo():
    print("ENTER")
    try:
        yield
    finally:
        print("EXIT")


@demo()
def test():
    print("Inbetween")
    
test()
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Benutzeravatar
Judge
User
Beiträge: 129
Registriert: Mittwoch 13. Juni 2012, 22:27
Wohnort: Ratingen
Kontaktdaten:

OMG ... wie offensichtlich! Danke & Sorry ;)
Antworten