Vérifier avant d'agir semble plus prudent. Ça ouvre pourtant un intervalle que Python préfère ne jamais laisser exister.Checking before acting looks more careful. Yet it opens a gap Python prefers to never let exist.
Le numéro précédent a traité l'exception comme un accident à contenir — with garantissait le nettoyage après coup. Ce numéro retourne la question : Python encourage-t-il à prévenir l'erreur, ou à la laisser survenir puis à la rattraper ? Deux styles s'opposent. LBYL — Look Before You Leap — vérifie une condition avant d'agir : tester qu'une clé existe avant de la lire, qu'un fichier existe avant de l'ouvrir. EAFP — Easier to Ask Forgiveness than Permission — tente l'opération directement, et attrape l'exception si elle échoue. Le second style est idiomatique en Python ; le premier, hérité d'habitudes plus défensives, cache un défaut structurel que ce numéro va exposer.The previous issue treated the exception as an accident to contain — with guaranteed cleanup after the fact. This issue flips the question: does Python encourage preventing the error, or letting it happen and then catching it? Two styles compete. LBYL — Look Before You Leap — checks a condition before acting: testing that a key exists before reading it, that a file exists before opening it. EAFP — Easier to Ask Forgiveness than Permission — attempts the operation directly, and catches the exception if it fails. The latter style is idiomatic in Python; the former, inherited from more defensive habits, hides a structural flaw this issue is about to expose.
# LBYL -- "Look Before You Leap" : vérifier, PUIS agir if "utilisateur" in cache: valeur = cache["utilisateur"] else: valeur = charger_depuis_la_base() # deux lectures de "cache" : une pour vérifier, une pour lire # -- rien ne garantit que l'état est LE MÊME entre les deux
# EAFP -- "Easier to Ask Forgiveness than Permission" : agir, PUIS gérer l'échec try: valeur = cache["utilisateur"] except KeyError: valeur = charger_depuis_la_base() # une seule lecture de "cache" -- pas d'intervalle entre vérifier et lire
Face à un if condition: agir(), demande : entre la vérification et l'action, l'état pourrait-il changer — par un autre thread, un autre processus, ou simplement le temps qui passe ? Si oui, LBYL ouvre une fenêtre que EAFP referme.Facing an if condition: act(), ask: between the check and the action, could the state change — via another thread, another process, or simply the passage of time? If so, LBYL opens a window that EAFP closes.