ProgrammatieBackend ontwikkelaar

Beschrijf de nuances van het gebruik van with open in Python. Wat gebeurt er op het moment van het openen/sluiten van een bestand, en welke valkuilen zijn er?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

with open(...) as f: — is de standaard manier om met bestanden te werken via een contextbeheerder. Met deze aanpak garandeert Python automatische sluiting van het bestand bij het verlaten van het with blok, zelfs als er een uitzondering optreedt. Dit voorkomt lekkages van bestandsdescriptoren en bestandssluitingen.

Binnen het blok kun je met het bestand werken door gebruik te maken van de methoden van het object (f.read(), f.write(), enz.). Na het verlaten van het blok (zelfs bij een fout) wordt de methode f.close() aangeroepen.

Voorbeeld:

with open('data.txt', 'w') as f: f.write('Hallo!') # Hier is het bestand al gesloten

Een trick-vraag.

Veelgestelde vraag:

Kun je er zeker van zijn dat het bestand, geopend via open, onmiddellijk na het verlaten van het with blok zal sluiten, zelfs als er een uitzondering optreedt in het midden van het blok?

Antwoord: Ja, dit is precies wat het contract van de contextbeheerder garandeert: ongeacht uitzonderingen, wordt de methode __exit__ aangeroepen bij het verlaten van het blok, wat leidt tot het sluiten van het bestand. Dit is het belangrijkste voordeel ten opzichte van een expliciete aanroep van f.close().

Voorbeelden van echte fouten vanwege het onwetend zijn over de nuances van het onderwerp.


Verhaal

In een groot project werden logboekregistraties gedaan via open('log.txt', 'a') en een expliciete aanroep naar f.write(), maar f.close() werd vergeten. Na langdurig gebruik heeft het proces alle bestandsdescriptoren van het OS verbruikt, en de service stopte met werken.


Verhaal

In het monitoring systeem werd het bestand continu geopend via open, zonder uitzonderingen te verwerken. Wanneer zich een fout voordeed, bleef het bestand open, wat leidde tot blokkades bij de poging om het opnieuw te openen vanuit een ander proces.


Verhaal

Een ontwikkelaar implementeerde het lezen van een groot bestand via open en deed vervolgens onmiddellijk een return in het midden van de functie, zonder het bestand te sluiten. Dit resulteerde in verschillende van dergelijke bewerkingen die leidden tot een overschrijding van de bestandsbronnen, en het OS begon nieuwe openingen te blokkeren.