Je me demandais quelles étaient les meilleures pratiques pour indiquer des combinaisons d'arguments invalides en Python. Je suis tombé sur quelques situations où vous avez une fonction comme ça:
def import_to_orm(name, save=False, recurse=False):
"""
:param name: Name of some external entity to import.
:param save: Save the ORM object before returning.
:param recurse: Attempt to import associated objects as well. Because you
need the original object to have a key to relate to, save must be
`True` for recurse to be `True`.
:raise BadValueError: If `recurse and not save`.
:return: The ORM object.
"""
pass
Le seul inconvénient est que chaque paquet a le sien, généralement légèrement différent BadValueError
. Je sais qu'il existe en Java java.lang.IllegalArgumentException
- est-il bien entendu que tout le monde va créer son propre BadValueError
s en Python ou existe-t-il une autre méthode préférée?
math.sqrt(-1)
, c'est une erreur de programmation qui doit être corrigée de toute façon.ValueError
n'est pas destiné à être pris dans l'exécution normale du programme ou il en dériveraitRuntimeError
.J'hériterais de
ValueError
Il est parfois préférable de créer vos propres exceptions, mais héritez d'une exception intégrée, qui est aussi proche de ce que vous voulez que possible.
Si vous devez détecter cette erreur spécifique, il est utile d'avoir un nom.
la source
Je pense que la meilleure façon de gérer cela est la façon dont python le gère lui-même. Python déclenche une TypeError. Par exemple:
Notre développeur junior vient de trouver cette page dans une recherche Google pour "les arguments incorrects de l'exception python" et je suis surpris que la réponse évidente (pour moi) n'ait jamais été suggérée dans la décennie depuis que cette question a été posée.
la source
int('a')
). sourcesum()
sans argument, ce qui est unTypeError
, mais l'OP se préoccupait des combinaisons «illégales» de valeurs d'argument lorsque les types d'argument sont corrects. Dans ce cas, les deuxsave
etrecurse
sont des bools, mais sirecurse
c'estTrue
alorssave
ne devrait pas l'êtreFalse
. Ceci est unValueError
. Je suis d'accord qu'une certaine interprétation du titre de la question serait répondu parTypeError
, mais pas pour l'exemple qui est présenté.Je viens surtout de voir le builtin
ValueError
utilisé dans cette situation.la source
Cela dépend du problème avec les arguments.
Si l'argument a le mauvais type, déclenchez une TypeError. Par exemple, lorsque vous obtenez une chaîne au lieu d'un de ces booléens.
Notez cependant qu'en Python, nous effectuons rarement des vérifications comme celle-ci. Si l'argument est vraiment invalide, une fonction plus profonde fera probablement la plainte pour nous. Et si nous vérifions uniquement la valeur booléenne, peut-être qu'un utilisateur de code lui fournira plus tard une chaîne en sachant que les chaînes non vides sont toujours True. Cela pourrait lui sauver un casting.
Si les arguments ont des valeurs non valides, augmentez ValueError. Cela semble plus approprié dans votre cas:
Ou dans ce cas spécifique, avoir une valeur True de recurse implique une valeur True de save. Étant donné que je considérerais cela comme une récupération après une erreur, vous pouvez également vous plaindre dans le journal.
la source
Je ne suis pas sûr d'être d'accord avec l'héritage de
ValueError
- mon interprétation de la documentation est que celleValueError
-ci n'est censée être générée que par les buildins ... l'hériter ou la générer vous-même semble incorrect.- Documentation ValueError
la source
ValueError
pour ce genre de chose, donc je pense que vous essayez d'en lire trop dans la documentation.Acceptez la suggestion de Markus de lever votre propre exception, mais le texte de l'exception devrait clarifier que le problème se trouve dans la liste d'arguments, pas dans les valeurs d'argument individuelles. Je proposerais:
Utilisé lorsque des arguments de mots clés sont manquants qui étaient requis pour l'appel spécifique, ou que les valeurs d'argument sont valides individuellement mais incohérentes les unes avec les autres.
ValueError
aurait toujours raison quand un argument spécifique est de type correct mais hors de portée.Cela ne devrait-il pas être une exception standard en Python?
En général, j'aimerais que le style Python soit un peu plus net pour distinguer les mauvaises entrées d'une fonction (faute de l'appelant) des mauvais résultats au sein de la fonction (ma faute). Il peut donc y avoir également une erreur BadArgumentError pour distinguer les erreurs de valeur dans les arguments des erreurs de valeur dans les sections locales.
la source
KeyError
pour un mot clé introuvable (car un mot clé explicite manquant est sémantiquement identique à un**kwargs
dict qui manque cette clé).