Seite 1 von 1

Eigener Context Manager

Verfasst: Freitag 27. November 2020, 14:32
von Judge
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

Re: Eigener Context Manager

Verfasst: Freitag 27. November 2020, 14:36
von Sirius3
Du mußt schon eine Instanz von `Demo` erzeugen.

Re: Eigener Context Manager

Verfasst: Freitag 27. November 2020, 15:09
von __blackjack__
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()

Re: Eigener Context Manager

Verfasst: Samstag 28. November 2020, 22:10
von Judge
OMG ... wie offensichtlich! Danke & Sorry ;)