问题
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]):
# Do something
number is either a float or int, depending on the user's input. Is there an official way to do that?
回答1:
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.Floatetc., this PEP proposes a straightforward shortcut that is almost as effective: when an argument is annotated as having typefloat, an argument of typeintis 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.
来源:https://stackoverflow.com/questions/50928592/mypy-type-hint-unionfloat-int-is-there-a-number-type