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)
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)
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.
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 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.