Vol. 7 — № 21
The Python Loop · KiosqueNewsstand
Blog  
Un atelier Python · Édition d'ApprentissageA Python Workshop · Learning Edition

finally, return et le générateur qui lève finally, return, and the generator that raises

with garantissait le nettoyage ; l'except précis évitait d'avaler un vrai bug. Reste une dernière subtilité : que se passe-t-il quand finally et return se disputent la dernière parole dans une même fonction ? Et quand un générateur, jamais épuisé jusqu'au bout, tient encore un fichier ouvert — qui referme sa ressource, et comment ? with guaranteed cleanup; a precise except avoided swallowing a real bug. One last subtlety remains: what happens when finally and return both compete for the last word in the same function? And when a generator, never fully exhausted, is still holding a file open — who closes its resource, and how?

AudienceAudience
Dev qui a déjà écrit un finally: return et n'a jamais vérifié ce que devenait la valeur du try Dev who's already written a finally: return and never checked what happened to the try's return value
Format
Self-paced
ChapitresChapters
5
Date
Juil 2026 Jul 2026
≈ 19 min ●●●● finallyGénérateursGeneratorExit

Chapitre 1 en accès libre — la suite (ch. 2 à 5) est réservée. Chapter 1 free to read — the rest (ch. 2–5) is members-only.

01CadrageFraming3 min

return ne quitte pas la fonction tout de suite — il attend que finally ait fini de parler.return doesn't leave the function right away — it waits for finally to finish speaking.

Le numéro précédent a détaillé les quatre clauses de try/except/else/finally et leur condition d'exécution respective — finally s'exécute toujours, avait-on dit, exception ou pas. Reste une question que ce résumé laisse ouverte : que se passe-t-il quand un return se trouve DANS le try, et que finally s'exécute juste après ? Lequel a le dernier mot sur ce que la fonction retourne réellement ? La réponse tient en une ligne : return met sa valeur de côté, laisse finally s'exécuter jusqu'au bout, et ne rend la main qu'ensuite — ce qui ouvre la porte à un cas bien plus troublant que ce numéro va exposer.The previous issue detailed the four clauses of try/except/else/finally and their respective execution condition — finally always runs, we said, exception or not. One question that summary leaves open remains: what happens when a return sits INSIDE the try, and finally runs right after? Which one gets the last word on what the function actually returns? The answer fits in one line: return sets its value aside, lets finally run to completion, and only then hands back control — which opens the door to a far more troubling case this issue is about to expose.

finally s'intercale entre le return et la sortie réelle de la fonctionfinally slots in between the return and the function's actual exit
def statut():
    try:
        return "ok"
    finally:
        print("nettoyage")   # s'exécute AVANT que "ok" ne soit vraiment retourné

print(statut())
# affiche :
# nettoyage
# ok
# -- return ne "sort" pas immédiatement de la fonction : il met la valeur
# de côté, laisse finally s'exécuter, PUIS seulement rend la main.
La question qui suitThe question that follows

Ici, finally ne fait qu'imprimer — il ne touche pas à la valeur de retour. Mais s'il contenait, lui aussi, un return ?Here, finally only prints — it doesn't touch the return value. But what if it contained a return of its own?

🔒

La suite est réservée The rest is members-only

Le premier numéro est libre. Débloque tout The Python Loop — tous les volumes, à vie — pour 5 €, paiement unique. The first issue is free. Unlock all of The Python Loop — every volume, forever — for €5, one-time.

Retour au kiosqueBack to newsstand