mypy est vraiment pratique et capture beaucoup de bugs, mais quand j'écris des applications "scientifiques", je finis souvent par faire:
def my_func(number: Union[float, int]):
# Do something
number
est soit un float soit un int, selon l'entrée de l'utilisateur. Existe-t-il un moyen officiel de le faire?
Utilisez float
uniquement , car int
est impliqué dans ce type:
def my_func(number: float):
PEP 484 Astuces de type indique spécifiquement que:
Plutôt que d'exiger que les utilisateurs écrivent des numéros d'importation puis utilisent
numbers.Float
Etc., ce PEP propose un raccourci simple qui est presque aussi efficace: lorsqu'un argument est annoté comme ayant le typefloat
, un argument de typeint
est acceptable ; de même, pour un argument annoté comme ayant un type complexe, les arguments de type float ou int sont acceptables.
(Souligné par moi).
Idéalement, vous utiliseriez toujours numbers.Real
:
from numbers import Real
def my_func(number: Real):
car cela accepterait également les objets fractions.Fraction()
et decimal.Decimal()
; la pyramide des nombres est plus large que les entiers et les valeurs à virgule flottante.
Cependant, ceux-ci ne fonctionnent pas actuellement lorsque vous utilisez mypy
pour effectuer votre vérification de type, voir Mypy # 3186 .