web-dev-qa-db-fra.com

mypy, type hint: Union [float, int] -> y a-t-il un type Number?

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?

23
JPFrancoia

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 type float, un argument de type int 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 .

28
Martijn Pieters