mypy, type hint: Union[float, int] -> is there a Number type?

后端 未结 3 1838
醉酒成梦
醉酒成梦 2021-02-01 12:28

mypy is really handy and catches a lot of bugs, but when I write \"scientific\" applications, I often end up doing:

def my_func(number: Union[float, int]):
    #         


        
相关标签:
3条回答
  • 2021-02-01 13:20

    For people who come to this question for the more general problem of Union typing hints for entities which don't have an existing supertype in common, for example Union[int, numpy.ndarray], the solution is to import Union from typing.

    Example 1:

    from typing import Union
    
    def my_func(number: Union[float, int]):
        # Do something
    

    Example 2:

    from typing import Union
    import numpy as np
    
    def my_func(x: Union[float, np.ndarray]):
        # do something
        # Do something
    
    0 讨论(0)
  • 2021-02-01 13:21

    Use float only, as int is implied in that type:

    def my_func(number: float):
    

    PEP 484 Type Hints specifically states that:

    Rather than requiring that users write import numbers and then use numbers.Float etc., this PEP proposes a straightforward shortcut that is almost as effective: when an argument is annotated as having type float, an argument of type int is acceptable; similar, for an argument annotated as having type complex, arguments of type float or int are acceptable.

    (Bold emphasis mine).

    Ideally you would still use numbers.Real:

    from numbers import Real
    
    def my_func(number: Real):
    

    as that would accept fractions.Fraction() and decimal.Decimal() objects as well; the number pyramid is broader than just integers and floating point values.

    However, these are not currently working when using mypy to do your type checking, see Mypy #3186.

    0 讨论(0)
  • 2021-02-01 13:21

    You can define your own type to address this and keep your code cleaner.

    FloatInt = Union[float, int]
    
    def my_func(number: FloatInt):
        # Do something
    
    0 讨论(0)
提交回复
热议问题