En Python, si je retourne à l'intérieur d'un “avec” block, le fichier reste proche?
De considérer les éléments suivants:
with open(path, mode) as f:
return [line for line in f if condition]
Sera le fichier doit être fermé correctement, ou ne l'aide return
quelque sorte court-circuiter le gestionnaire de contexte?
Vous devez vous connecter pour publier un commentaire.
Oui, il agit comme le
finally
bloc après untry
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 l'un des exemples de PEP-343 qui est la norme pour la
with
déclaration:Quelque chose à souligner, cependant, que vous ne pouvez pas facilement attraper les exceptions levées par le
open()
appel sans mettre l'ensemble de lawith
bloc à l'intérieur d'untry..except
bloc qui n'est généralement pas ce que l'on veut.else
pourrait être ajouté àwith
à résoudre quetry with except
problème. edit: ajouté à la langueProcess.terminate()
est l'un des rares (le seul?) scénario qui ne garantit pas à l'appel d'unfinally
déclaration: "a Noter que la sortie des gestionnaires et, enfin, des clauses, etc., ne sera pas exécuté."os._exit
est parfois utilisé - qu'il sort de l'Python processus sans appel de nettoyage des gestionnaires.with
bloc, la garantie ne tenez aussi longtemps que le générateur de garde fourniture de valeurs? aussi longtemps que rien y fait référence? I. e. dois-je utiliserdel
ou d'affecter une valeur à la variable qui contient l'objet du générateur?return mmap.mmap(f.fileno(), path.stat().st_size)
? Sera le fichier fermé, la rupture de la carte mémoire? Ou le fait que la mémoire de la carte dépend du fichier descripteur de garder le dossier ouvert pour le champ d'application de l'objet retourné?Oui.
..est à peu près équivalent à:
Avec plus de précision, le
__exit__
méthode dans un gestionnaire de contexte est toujours appelée lors de la sortie du bloc (indépendamment des exceptions, retours, etc). Le fichier de l'objet__exit__
méthode appelle justef.close()
(e.g ici, dans Disponible)finally
keywrod est:def test(): try: return True; finally: return False
.Oui. Plus généralement, la
__exit__
méthode de Avec La Déclaration Gestionnaire De Contexte va en effet être appelé en cas dereturn
de l'intérieur du contexte. Cela peut être testé avec les éléments suivants:La sortie est:
La sortie ci-dessus confirme que
__exit__
a été appelé, malgré le début dereturn
. En tant que tel, le gestionnaire de contexte n'est pas contournée.Oui, mais il peut y avoir des effets secondaires dans d'autres cas, car il peut faire quelque chose (comme pour la vidange de la mémoire tampon) dans
__exit__
bloc