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: 18306
Registriert: Sonntag 21. Oktober 2012, 17:20

Du mußt schon eine Instanz von `Demo` erzeugen.
Benutzeravatar
__blackjack__
User
Beiträge: 14178
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()
“Every thinking person fears nuclear war and every technological nation plans for it. Everyone knows
it's madness, and every country has an excuse.” — Carl Sagan, Cosmos, Episode 13: Who Speaks for Earth?
Benutzeravatar
Judge
User
Beiträge: 129
Registriert: Mittwoch 13. Juni 2012, 22:27
Wohnort: Ratingen
Kontaktdaten:

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