Je suis encore assez nouveau à Python et j'essaie de m'habituer à son typage dynamique. Parfois, j'ai une fonction ou une classe qui attend un paramètre d'un certain type, mais pourrait obtenir une valeur d'un autre type qui lui est coercible. Par exemple, il peut s'attendre à un float
mais recevoir un int ou un nombre décimal. Ou il peut s'attendre à une chaîne, mais reçoit à la place un objet qui définit la méthode spéciale __str__
.Meilleur endroit pour contraindre/convertir au bon type en Python
Quelle est la meilleure pratique pour contraindre l'argument au bon type (et la raison pour cela)? Est-ce que je le fais dans la fonction/classe ou dans l'appelant? Si je suis dans l'appelant, est-ce que je le vérifie également dans la fonction? Par exemple.
Alternative 1:
def myfunc(takes_float):
myval = float(takes_float)
myfunc(5)
Alternative 2:
def myfunc(takes_float):
myval = takes_float
myfunc(float(5))
Alternative 3:
def myfunc(takes_float):
assert isinstance(takes_float, float)
myval = takes_float
myfunc(float(5))
Je l'ai déjà ils lisent this answer et this one et ils disent que vérifier les types en Python est "mauvais", mais je ne veux pas perdre de temps à rechercher des bogues très simples qui seraient immédiatement détectés par le compilateur dans un langage statique.
N'utilisez pas 'assert' comme ça. Les assertions sont destinées à documenter des conditions qui ne peuvent pas se produire lors de l'exécution, et non à valider une entrée. –
Oui, impossible d'arriver à moins qu'il y ait un bug. En alternative 3, où l'appelant doit convertir la valeur, ce serait un bug. – EMP