“Demander pardon de ne pas l'autorisation” - expliquer

Je ne demande pas à des fins personnelles "religieux" avis au sujet de cette philosophie, plutôt quelque chose d'un peu plus de technique.

Je comprends cette phrase est l'un de plusieurs de tournesol tests pour voir si votre code est "pythonic". Mais pour moi, pythonic signifie propre, simple et intuitive, pas chargé avec des gestionnaires d'exception pour les mauvais codage.

Donc, à l'exemple pratique. Je définir 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, venir à partir d'un contexte procédural, dans une autre fonction que je veux faire ceci:

if foo.bar:
    # do stuff

Je vais obtenir un attribut exception si j'étais impatient et n'a pas faire les premiers foo = None. Donc, "demander pardon de ne pas l'autorisation" donne à penser que je devrais faire à la place?

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

Pourquoi il serait mieux pour moi d'ajouter une logique supplémentaire dans un bloc try juste pour que je puisse laisser ma définition de la classe plus ambigu? Pourquoi ne pas définir tout d'abord, donc explicitement accorder l'autorisation?

(Ne me battre sur l'utilisation de blocs try/except... je l'utilise partout. Je ne pense pas qu'il est juste de les utiliser pour attraper mes propres erreurs car je n'ai pas approfondi programmeur.)

Ou... dois-je totalement méconnaître le "Demander Forgivess" mantra?

  • Votre déclaration "n'est pas chargé avec des gestionnaires d'exception pour les mauvais codage" est un non sequitur. Bon code a tous à l'exception de la manipulation nécessaire, mais pas un peu plus. Et la présence de gestionnaires d'exceptions à peine implique de "mauvais codage." Je pense que sa serait préférable de laisser l'application gérer un problème si possible (si pour aucune autre raison que de fermer gracieusement), plutôt que de permettre qu'il se bloque sans ménagement dans les genoux de l'utilisateur 🙂
  • Vous ne devriez pas essayer d'ajouter des gestionnaires d'exception pour attraper les mauvais codage, et surtout pas un nu except: clause. Vos tests unitaires doivent attraper ces problèmes, et il n'y a rien de mal avec l'exception de cracher une traçabilité en amont et en tuant l'ensemble du processus pour ce genre d'erreur.
  • Un autre avantage de demander pardon, c'est qu'il peut parfois éviter des bugs que l'autorisation ne peut tout simplement pas, lorsque vous faites affaire avec de dynamique hors de votre contrôle. Je pense que l'exemple canonique est os.path.exists, qui vous indique seulement que le fichier existe ou n'existe pas, à un certain point. Probablement 90%+ de if os.path.exists(filename): do_something_to(filename) les usages sont techniquement buggy.
  • ou tout simplement open() - ne pas vérifier pour voir si vous pouvez ouvrir le fichier en premier (autorisations, à l'existence, etc...) - il suffit de l'essayer 🙂 [qui évite des conditions de course]
InformationsquelleAutor hikaru | 2012-09-04