<div dir="auto">This sounds like a good observation. I recommend opening a bug and preparing a PR if you can (a PR would also help finding if there are any problems with the idea).</div><div class="gmail_extra"><br><div class="gmail_quote">On Dec 29, 2017 9:50 AM, "Yahya Abou 'Imran via Python-ideas" <<a href="mailto:python-ideas@python.org">python-ideas@python.org</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>After I generate an UML diagram from collections.abc, I found very strange that MappingView inherit from Sized instead of Collection (new in python 3.6).<br></div><div><br></div><div>Yes, MappingView only define __len__ and not __iter__ and __contains__, but all of its subclasses define them (KeysView, ValuesView and ItemViews).<br></div><div><br></div><div>I tried to run the tests in test/test_collections.py after making this change and on only one fail :<br></div><div><br></div><div>Traceback (most recent call last):<br></div><div>  File "/usr/lib/python3.6/test/test_<wbr>collections.py", line 789, in test_Collection<br></div><div>    self.assertNotIsInstance(x, Collection)<br></div><div>AssertionError: dict_values([]) is an instance of <class 'collections.abc.Collection'><br></div><div><br></div><div>Wich is absolutely wrong, since in reality a dict_values instance has the behaviour of a Collection:<br></div><div><br></div><div>>>> vals = {1:'a', 2: 'b'}.values()<br></div><div>>>> 'a' in vals<br></div><div>True<br></div><div>>>> 'c' in vals<br></div><div>False<br></div><div>>>> len(vals)<br></div><div>2<br></div><div>>>> for val in vals:<br></div><div>...     print(val)<br></div><div>...    <br></div><div>a<br></div><div>b<br></div><div><br></div><div>The only lack is that it doesn't define a __contains__ method:<br></div><div><br></div><div>>>> '__contains__' in vals<br></div><div>False<br></div><div><br></div><div>It uses __iter__ to find the presence of the value.<br></div><div><br></div><div>But, hey: we have register() for this cases! In fact, when MappingView inherit from Collection, dict_values is considered as a subclass of Collection since it's in the register of ValuesView, causing the above bug...<br></div><div>So, the test have to be changed, and dict_values must be placed in the samples that pass the test, and not in the ones that fail it.<br></div><div><br></div><div>Maybe we can open an issue on the python bug tracker?<br></div><br>______________________________<wbr>_________________<br>
Python-ideas mailing list<br>
<a href="mailto:Python-ideas@python.org">Python-ideas@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-ideas" rel="noreferrer" target="_blank">https://mail.python.org/<wbr>mailman/listinfo/python-ideas</a><br>
Code of Conduct: <a href="http://python.org/psf/codeofconduct/" rel="noreferrer" target="_blank">http://python.org/psf/<wbr>codeofconduct/</a><br>
<br></blockquote></div></div>