A blog post on choosing more specific types rather than general ones like list and dict.
The problem is that there's a severe hole in the ABCs: there is no distinction between "container whose elements are mutable" and "container whose elements and size are mutable".
(related, there's no distinction for supporting slice operations or not, e.g.
deque
)If you don't need to reuse the collection or access its items out of order, you can also use
Iterable
which accepts even more inputs like generators.Good point, and Łukasz Langa mentioned this in his talk (check it out). He names it the robustness principle, in his words (around
22:20
mark:"Vague in what you accept, concrete in what you return"
But he also mentions some gotchas like how
Iterable[str]
can backfire, becausestr
is also anIterable[str]
and it might be better to uselist[str]
.Sequence
now lives atcollections.abc
. BTW,float
is not a supertype ofint
(issubclass(int, float) == False
). Normaly, It is acceptable to useint
instead offloat
, but speaking of variance, it is more precise to usenumbers.Real
:issubclass(Integral, Real) == True issubclass(int, Real) == True issubclass(float, Real) == True issubclass(complex, Real) == False
yeah it's an interesting case that an int can be treated as a float. I should probably update my post to mention that it's not strictly a supertype but a special exception mentioned in python's typehinting pep: https://peps.python.org/pep-0484/#the-numeric-tower