Considérer ce qui suit:
with open(path, mode) as f:
return [line for line in f if condition]
Le fichier sera-t-il fermé correctement, ou l'utilisation d'une return
manière ou d'une autre contourne-t-elle le gestionnaire de contexte ?
python
return
with-statement
Lightbreeze
la source
la source
else
pourrait être ajoutéwith
pour résoudre cetry 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'unefinally
instruction: "Notez que les gestionnaires de sortie et enfin les clauses, etc., ne seront pas réalisé."os._exit
est parfois utilisé - il quitte le processus Python sans appeler de gestionnaires de nettoyage.with
bloc, la garantie est-elle valable aussi longtemps que le générateur continue de produire des valeurs? aussi longtemps que quelque chose y fait référence? Est-ce que j'ai besoin d'utiliserdel
ou d'attribuer une valeur différente à la variable qui contient l'objet générateur?ValueError: I/O operation on closed file.
.Oui.
..est à peu près équivalent à:
Plus précisément, la
__exit__
méthode dans un gestionnaire de contexte est toujours appelée lors de la sortie du bloc (quelles que soient les exceptions, les retours, etc.). La__exit__
méthode de l'objet fichier appelle simplementf.close()
(par exemple ici en CPython )la source
finally
keywrod est:def test(): try: return True; finally: return False
.Oui. Plus généralement, la
__exit__
méthode d'un With Statement Context Manager sera en effet appelée 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 qu'elle a
__exit__
été appelée malgré le débutreturn
. En tant que tel, le gestionnaire de contexte n'est pas contourné.la source
Oui, mais il peut y avoir des effets secondaires dans d'autres cas, car cela peut faire quelque chose (comme le vidage du tampon) dans le
__exit__
blocla source