Duck type compatibility¶
In Python, certain types are compatible even though they aren’t subclasses of
each other. For example,
int objects are valid whenever
are expected. Mypy supports this idiom via duck type compatibility. As of
now, this is only supported for a small set of built-in types:
intis duck type compatible with
floatis duck type compatible with
- In Python 2,
stris duck type compatible with
Mypy support for Python 2 is still work in progress.
For example, mypy considers an
int object to be valid whenever a
float object is expected. Thus code like this is nice and clean
and also behaves as expected:
def degrees_to_radians(x: float) -> float: return math.pi * degrees / 180 n = 90 # Inferred type 'int' print(degrees_to_radians(n)) # Okay!
Note that in Python 2 a
str object with non-ASCII characters is
often not valid when a unicode string is expected. The mypy type
system does not consider a string with non-ASCII values as a
separate type so some programs with this kind of error will
silently pass type checking. In Python 3
separate, unrelated types and this kind of error is easy to
detect. This a good reason for preferring Python 3 over Python 2!
See Text and AnyStr for details on how to enforce that a value must be a unicode string in a cross-compatible way.