Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Leer Aangepaste Contextmanagers Maken | Advanced File Handling & Context Managers
Python Structureel Programmeren

Aangepaste Contextmanagers Maken

Veeg om het menu te tonen

Om volledig gebruik te maken van de kracht van contextmanagers in Python, kun je je eigen contextmanager maken door een klasse te definiëren die de methoden __enter__ en __exit__ implementeert. De methode __enter__ wordt aangeroepen wanneer de uitvoering het contextblok van de with-instructie binnengaat, en de returnwaarde wordt toegewezen aan de variabele na as. De methode __exit__ wordt aangeroepen wanneer de uitvoering het contextblok verlaat, ongeacht of dit normaal gebeurt of door een uitzondering. Dit ontwerp maakt het mogelijk om resources veilig en voorspelbaar op te zetten en af te breken, wat vooral nuttig is bij het beheren van bestanden, netwerkverbindingen of locks.

De methode __exit__ ontvangt drie argumenten: exc_type, exc_value en traceback. Deze geven details over eventuele uitzonderingen die zich binnen het contextblok voordoen. Als __exit__ True retourneert, wordt de uitzondering onderdrukt; anders zal de uitzondering na de opruiming worden doorgegeven. Door deze methoden te implementeren, kun je precies bepalen hoe het opzetten en opruimen van je resource verloopt, waardoor je code robuuster en beter onderhoudbaar wordt.

class FileLogger:
    def __init__(self, filename, logname):
        self.filename = filename
        self.logname = logname
        self.file = None
        self.log = None

    def __enter__(self):
        self.file = open(self.filename, "r")
        self.log = open(self.logname, "a")
        self.log.write(f"Opened file: {self.filename}\n")
        return self.file

    def __exit__(self, exc_type, exc_value, traceback):
        if self.file:
            self.file.close()
            self.log.write(f"Closed file: {self.filename}\n")
        if self.log:
            self.log.close()
        # Do not suppress exceptions
        return False

De volgende code demonstreert een aangepaste contextmanagerklasse FileLogger. Deze klasse is ontworpen om een doelbestand te openen voor lezen en een logbestand voor het toevoegen van logregels. Bij het betreden van de context (met de with-instructie) wordt het openen van het bestand gelogd. Bij het verlaten van de context – zowel bij normale uitvoering als bij een uitzondering – wordt het sluiten van het bestand gelogd en wordt ervoor gezorgd dat beide bestanden correct worden gesloten. De methode __exit__ onderdrukt geen uitzonderingen, zodat deze na de opruiming worden doorgegeven.

question mark

Welke uitspraak beschrijft het beste de rol van de methode __exit__ in een aangepaste contextmanager?

Selecteer het correcte antwoord

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 2. Hoofdstuk 5

Vraag AI

expand

Vraag AI

ChatGPT

Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.

Sectie 2. Hoofdstuk 5
some-alt