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