Cheng
Cheng

Reputation: 17954

Why bool and int are not considered as a type error when str and float is required?

When using mypy and pyre-check to check type errors of the following code, neither produces an error:

from typing import List, Union

tlist: List[Union[str, float]] = [False, int(12)]

Just curious why is that?

Upvotes: 0

Views: 993

Answers (1)

Martijn Pieters
Martijn Pieters

Reputation: 1124178

bool is a subclass of int, which means they are both natural numbers. Natural numbers are a subset of real numbers, so they are acceptable where a float is acceptable.

That int is acceptable where float is specified is explicitly called out in PEP 484 -- Type Hints:

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[.]

  • The str component in your Union[] doesn't play any role here; you could remove it and still the assignment would be accepted. It's purely the float type annotation that makes 12 and False acceptable values.

  • The int() call is entirely redundant, the 12 literal syntax already produces an int object.

Upvotes: 3

Related Questions