12
votes

Quelle exception à élever si un mauvais nombre d'arguments passés à ** kwargs?

Supposons dans Python, vous avez une routine qui accepte trois paramètres nommés (comme * ** kwargs), mais tous les deux sur ces trois doivent être remplis. Si un seul est rempli, c'est une erreur. Si tous les trois sont, c'est une erreur. Quel type d'erreur souleveriez-vous? RuntimeError, une exception spécifiquement créée ou autre?


0 commentaires

6 Réponses :


3
votes

Je ferais un spécifique. Vous pouvez l'attraper et traiter cette exception spécifique puisqu'il s'agit d'une circonstance particulière que vous avez créée :)


0 commentaires

4
votes

Si (comme vous le dites dans l'un des commentaires), il s'agit d'une erreur de programmeur, vous pouvez augmenter AssertionError:

def two(a=None, b=None, c=None):
    pass


0 commentaires

0
votes

J'utiliserais une valeur ValueError, ou une sous-classe de celui-ci: "Élevé lorsqu'une opération intégrée ou une fonction reçoit un argument qui a le type de bon type mais une valeur inappropriée, et la situation n'est pas décrite par une exception plus précise telle que IndexError. "

Passage 3 ou 1 Valeurs Quand exactement 2 sont requis, une valeur inappropriée sera techniquement si vous considérez que tous les arguments un seul tuple ... au moins à mon avis! :)


0 commentaires

14
votes

Pourquoi ne pas simplement faire ce que fait python? XXX


0 commentaires

0
votes

Je recommande une exception personnalisée. Comme: XXX

Ensuite, vous pouvez SOUMETEREEXACTLYTWO dans votre code.

Assurez-vous de le documenter dans la docstring pour votre fonction. < / p>


0 commentaires

16
votes

N'oubliez pas que vous pouvez sousclure les classes d'exception intégrées de Python (et typeError serait sûrement la bonne classe d'exception intégrée à augmenter ici - c'est ce que Python augmente si le nombre d'arguments ne fait pas Faites correspondre la signature, dans des cas normaux sans * A ou ** k dans la signature). J'aime avoir chaque colis définir sa propre erreur une erreur de classe (exception) , puis des exceptions spécifiques selon les besoins peuvent multiplier hériter le cas échéant, par exemple: xxx

alors, je ' d élever des erreurs d'erreur lorsque je détecte une situation aussi problématique.

De cette façon, tout appelant qui est au courant de ce paquet peut attraper thippackage.error , si elles Nécessité de faire face à toute erreur spécifique à l'emballage, tandis que d'autres appelants (probablement plus élevés dans la chaîne d'appels) Catch toujours le plus générique typeError pour traiter les erreurs telles que "mauvais nombre d'arguments utilisés dans un appel de la fonction ".


1 commentaires

C'est un bel exemple d'utilisation de multiples héritages bien. Merci.