7
votes

PRATIQUES PYTHON: Y a-t-il un meilleur moyen de vérifier les paramètres du constructeur?

Je me trouve essayer de convertir des paramètres de constructeur vers leurs types de droite très souvent dans mes programmes Python. Jusqu'à présent, j'utilise du code similaire à cela, donc je n'ai pas à répéter les arguments d'exception: xxx

est-ce une bonne pratique? Devrais-je simplement ne pas prendre la peine d'attraper des exceptions sur la conversion et de les laisser se propager à l'appelant, avec l'inconvénient possible d'avoir des messages d'erreur moins significatifs et cohérents?


1 commentaires

Si ce n'est pas une interface de l'utilisateur, laissez-la intacte et laissez l'exception se propager naturellement. Vous faites plus de travail pour vous-même et enveloppez l'exception n'ajoute pas beaucoup de valeur.


3 Réponses :



2
votes

Ceci est subjectif, mais voici un contre-argument: xxx

attendre, quoi? Cela devrait être un typeError . Je ferais ceci: xxx

ok, donc cela viole les principes "dactylographie du canard". Mais je n'utiliserais pas de dactylographie de canard pour des objets primitifs tels que int .


0 commentaires

11
votes

Quand j'ai une question comme celle-ci, je vais chasser dans la bibliothèque standard pour le code que je peux modéliser mon code après. multiprocessing / piscine.py a une classe quelque peu proche de la vôtre: xxx pré>

Notez que cela ne dit pas p>

class ClassWithThreads(object):
    def __init__(self, num_threads):
        self.num_threads = num_threads
        if self.num_threads < 1:
            raise ValueError('Number of threads must be at least 1')


1 commentaires

Cette approche ne serait-elle certainement pas échouer très imprévisible pour certaines conditions? Par exemple, le passage d'une chaîne ne serait pas attrapé comme une erreur du tout (car ils ne compareront jamais comme <1 ). Mon intention des contrôles préventifs tente de garantir une certaine cohérence dans l'état de l'objet, détecter les erreurs le plus tôt possible au lieu d'avoir une exception associée au hasard être lancée plus tard. Est-ce que c'est «plus pythonique» de simplement laisser les choses être et échouer à une fois plus tard?