319 votes

Si je reviens dans un bloc with, le fichier est-il garanti de fermer?

Prenez le code suivant

 with open(path, mode) as f:
    return [line for line in f if condition]
 

Le fichier sera-t-il fermé correctement ou le retour contournera-t-il le gestionnaire de contexte?

(Python 2.7)

292voto

ThiefMaster Points 135805

Oui, il agit comme l' finally bloc après un try bloc, c'est à dire qu'il s'exécute toujours (à moins que le python, un processus se termine d'une manière inhabituelle, bien sûr).

Il est également mentionné dans un des exemples de la PEP-343 qui est la norme pour l' with déclaration:

with locked(myLock):
    # Code here executes with myLock held.  The lock is
    # guaranteed to be released when the block is left (even
    # if via return or by an uncaught exception).

Quelque chose à souligner, cependant, que vous ne pouvez pas facilement attraper les exceptions levées par l' open() appel sans mettre l'ensemble de l' with bloc à l'intérieur d'un try..except bloc qui n'est généralement pas ce que l'on veut.

48voto

dbr Points 66401

Oui.

 def example(path, mode):
    with open(path, mode) as f:
        return [line for line in f if condition]
 

..est à peu près équivalent à:

 def example(path, mode):
    f = open(path, mode)

    try:
        return [line for line in f if condition]
    finally:
        f.close()
 

Plus précisément, la méthode __exit__ dans un gestionnaire de contexte est toujours appelée lors de la sortie du bloc (quelles que soient les exceptions, les retours, etc.). L'objet de fichier __exit__ méthode qu'appeler f.close() (par exemple ici CPython )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X