Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python collections ValuesView abc: why doesn't it inherit from Iterable?

I was just checking out some docs on collections.abcs for a project of mine, where I need to do some type-related work. Those are the official docs about the ValuesView type, in both Python 2 and 3:

and this is the source (Python 2, but same happens in Python 3)

I was very puzzled about the ValuesView interface, because from a logical standpoint it should inherit from Iterable, IMHO (it's even got the __iter__ Mixin method); on the contrary the docs say that it just inherits from MappingView, which inherits from Sized, which doesn't inherit from Iterable.

So I fired up my 2.7 interpreter:

>>> from collections import Iterable
>>> d = {1:2, 3:4}
>>> isinstance(d.viewvalues(), Iterable) 
True
>>>

It looks Iterable, after all, because of Iterable's own subclasshook.

But I don't understand why ValuesView isn't explicitly Iterable. Other ABCs, like Sequence or Set, are explicitly Iterable. Is there some arcane reason behind that, or it's just a documentation+implementation shortcoming for a little-used feature?

like image 286
Alan Franzoni Avatar asked Jun 13 '16 07:06

Alan Franzoni


1 Answers

In Python 3.7.2, it inherits from both MappingView and Collection which in turn inherits from (among others) Iterable. Someone listened to you.

like image 143
LemonPy Avatar answered Oct 14 '22 18:10

LemonPy