web-dev-qa-db-fra.com

Quel est le principe EAFP en Python?

Que signifie "utiliser le principe EAFP" en Python? Pourriez-vous donner des exemples?

115
Unpaid Oracles

Extrait du glossaire :

Plus facile de demander pardon que la permission. Ce style de codage commun Python suppose l'existence de clés ou d'attributs valides et intercepte les exceptions si l'hypothèse se révèle fausse. Ce style propre et rapide se caractérise par la présence de nombreux try et except instructions. La technique contraste avec le style LBYL commun à de nombreuses autres langues comme C.

Un exemple serait une tentative d'accès à une clé de dictionnaire.

EAFP:

try:
    x = my_dict["key"]
except KeyError:
    # handle missing key

LBYL:

if "key" in my_dict:
    x = my_dict["key"]
else:
    # handle missing key

La version LBYL doit rechercher la clé dans le dictionnaire deux fois, et peut également être considérée comme légèrement moins lisible.

189
Sven Marnach

Je vais essayer de l'expliquer avec un autre exemple.

Ici, nous essayons d'accéder au fichier et d'imprimer le contenu dans la console.

LBYL - Regardez avant de sauter:

Nous pourrions vouloir vérifier si nous pouvons accéder au fichier et si nous le pouvons, nous allons l'ouvrir et imprimer le contenu. Si nous ne pouvons pas accéder au fichier, nous frapperons la partie else. La raison pour laquelle il s'agit d'une condition de concurrence est que nous effectuons d'abord une vérification d'accès. Au moment où nous atteignons with open(my_file) as f: peut-être que nous ne pouvons plus y accéder en raison de certains problèmes d'autorisation (par exemple, un autre processus obtient un verrou de fichier exclusif). Ce code générera probablement une erreur et nous ne serons pas en mesure de détecter cette erreur car nous pensions pouvoir accéder au fichier.

import os

my_file = "/path/to/my/file.txt"

# Race condition
if os.access(my_file, os.R_OK):
    with open(my_file) as f:
        print(f.read())
else:
    print("File can't be accessed")

EAFP - Plus facile de demander pardon que permission:

Dans cet exemple, nous essayons simplement d'ouvrir le fichier et si nous ne pouvons pas l'ouvrir, il lancera un IOError. Si nous le pouvons, nous ouvrirons le fichier et imprimerons le contenu. Donc, au lieu de demander quelque chose, nous essayons de le faire. Si cela fonctionne, tant mieux! Si ce n'est pas le cas, nous interceptons l'erreur et la gérons.

# # No race condition
try:
    f = open(my_file)
except IOError as e:
    print("File can't be accessed")
else:
    with f:
        print(f.read())
5
Apoorv Patne

Je l'appelle "programmation optimiste". L'idée est que la plupart du temps, les gens feront la bonne chose, et les erreurs devraient être peu nombreuses. Donc, codez d'abord pour que la "bonne chose" se produise, puis détectez les erreurs si elles ne se produisent pas.

Mon sentiment est que si un utilisateur fait des erreurs, c'est lui qui devrait en subir les conséquences temporelles. Les personnes qui utilisent l'outil de la bonne façon sont accélérées.

5
Engineer