["python","python-typing"]
What is the difference between type-hinting a variable as an Iterable versus a Sequence?

I don't understand the difference when hinting Iterable and Sequence. What is the main difference between those two and when to use which? I think set is an Iterable but not Sequence, are there any built-in data type that is Sequence but not Iterable? def foo(baz: Sequence[float]): ... # What is the difference? def bar(baz: Iterable[float]): ...
The Sequence and Iterable abstract base classes (can also be used as type annotations) mostly* follow Python's definition of sequence and iterable. To be specific: Iterable is any object that defines __iter__ or __getitem__. Sequence is any object that defines __getitem__ and __len__. By definition, any sequence is an iterable. The Sequence class also defines other methods such as __contains__, __reversed__ that calls the two required methods. Some examples: list, tuple, str are the most common sequences. Some built-in iterables are not sequences. For example, reversed returns a reversed object (or list_reverseiterator for lists) that cannot be subscripted. * Iterable does not exactly conform to Python's definition of iterables — it only checks if the object defines __iter__, and does not work for objects that's only iterable via __getitem__ (see this table for details). The gold standard of checking if an object is iterable is using the iter builtin.