103 votes

"Demandez le pardon, pas la permission" - expliquer

Je ne demande pas d'avis personnel "religieux" sur cette philosophie, mais plutôt quelque chose d'un peu plus technique.

Je crois savoir que cette phrase est l'un des nombreux tests décisifs permettant de déterminer si votre code est "pythonique". Mais pour moi, pythonique signifie propre, simple et intuitif, pas chargé de gestionnaires d'exceptions pour un mauvais codage.

Donc, exemple pratique. Je définis une classe :

class foo(object):
    bar = None

    def __init__(self):
        # a million lines of code
        self.bar = "Spike is my favorite vampire."
        # a million more lines of code

Maintenant, venant d'un fond procédural, dans une autre fonction je veux faire ceci :

if foo.bar:
    # do stuff

J'obtiendrai une exception d'attribut si j'ai été impatient et n'a pas faire l'initial foo = None. Donc, "demander pardon pas la permission" suggère que je devrais faire ceci à la place ?

try:
    if foo.bar:
        # do stuff
except:
    # this runs because my other code was sloppy?

Pourquoi serait-il préférable pour moi d'ajouter une logique supplémentaire dans un bloc try juste pour pouvoir laisser la définition de ma classe plus ambiguës ? Pourquoi ne pas définir tout au départ, donc explicitement accorder la permission ?

(Ne me reprochez pas d'utiliser les blocs try/except... Je les utilise partout. Je pense juste que ce n'est pas bien de les utiliser pour attraper mes propres erreurs parce que je n'étais pas un programmeur minutieux).

Ou... est-ce que j'ai complètement mal compris le mantra "Demandez pardon" ?

7voto

nick Points 61

Bien qu'il y ait déjà un certain nombre de réponses de qualité, la plupart d'entre elles abordent la question d'un point de vue stylistique plutôt que fonctionnel.

Dans certains cas, nous devons demander pardon et non pas demander la permission pour assurer un code correct (en dehors des programmes multithreads).

Un exemple canonique étant,

if file_exists: 
    open_it()

Dans cet exemple, le fichier a pu être supprimé entre la vérification et la tentative d'ouverture effective du fichier. Ceci est évité en utilisant try :

try:
    open_it()
except FileNotFoundException:
    pass # file doesn't exist 

Cela se produit à différents endroits, souvent en travaillant avec des systèmes de fichiers ou des API externes.

5voto

Nicola Musatti Points 10070

Dans le contexte de Python, "Ask forgiveness not permission" implique un style de programmation où l'on ne vérifie pas que les choses sont telles que l'on s'y attend, mais plutôt où l'on gère les erreurs qui en résultent si elles ne le sont pas. L'exemple classique est de ne pas vérifier qu'un dictionnaire contient une clé donnée comme dans :

d = {}
k = "k"
if k in d.keys():
  print d[k]
else:
  print "key \"" + k + "\" missing"

Mais plutôt pour gérer l'erreur qui en résulte si la clé est manquante :

d = {}
k = "k"
try:
  print d[k]
except KeyError:
  print "key \"" + k + "\" missing"

Toutefois, il ne s'agit pas de remplacer chaque if dans votre code avec un try / except cela rendrait votre code décidément plus désordonné. Au lieu de cela, vous ne devriez attraper les erreurs que lorsque vous pouvez vraiment faire quelque chose à leur sujet. Idéalement, cela réduirait la quantité de gestion des erreurs dans votre code, rendant son objectif réel plus évident.

2voto

Doug T. Points 33360

Demander le pardon et non la permission est destiné à simplifier le code. Il est destiné à ce que le code soit écrit comme ça quand il y a une attente raisonnable que .bar pourrait déclencher une AttributeError.

 try:
     print foo.bar
 except AttributeError as e
     print "No Foo!" 

Votre code semble à la fois demander la permission ET le pardon :)

En fait, si vous vous attendez raisonnablement à ce que quelque chose échoue, utilisez un try/catch. Si vous ne vous attendez pas à ce que quelque chose échoue, et qu'il échoue quand même, l'exception qui est levée devient l'équivalent d'une assertion échouée dans d'autres langages. Vous voyez où l'exception inattendue se produit et ajustez votre code/hypothèse en conséquence.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X