[Python-ideas] Change the __repr__ of the `MappingView`s

Guido van Rossum guido at python.org
Sat Dec 30 19:44:36 EST 2017


You're right that there's some inconsistency here. But I don't think it's
worth fixing given that the fix would introduce another inconsistency
(which you pointed out) and would also risk breaking backwards
compatibility. I think this ship has sailed.

On Sat, Dec 30, 2017 at 5:18 PM, Yahya Abou 'Imran via Python-ideas <
python-ideas at python.org> wrote:

> === This proposition is purely aesthetic ===
>
> At this time, the __repr__ of the mapping views is showing the whole
> mapping:
>
> >>> from collections.abc import ValuesView, KeysView, ItemsView
> >>> d = {3: 'three', 4: 'four'}
> >>> KeysView(d)
> KeysView({3: 'three', 4: 'four'})
> >>> ValuesView(d)
> ValuesView({3: 'three', 4: 'four'})
> >>> ItemsView(d)
> ItemsView({3: 'three', 4: 'four'})
>
> Witch is not consistent with dict_keys, dict_values, dict_items:
>
> >>> d.keys()
> dict_keys([3, 4])
> >>> d.values()
> dict_values(['three', 'four'])
> >>> d.items()
> dict_items([(3, 'three'), (4, 'four')])
>
> We could easily change that, since all the views are iterables on what
> they are designed for, in MappingView:
>
> def __repr__(self):
>     viewname = self.__class__.__name__
>     elements = ', '.join(map(repr, self))
>     return f'{viewname}([elements])
>
> And now:
>
> >>> KeysView(d)
> KeysView([3, 4])
> >>> ValuesView(d)
> ValuesView(['three', 'four'])
> >>> ItemsView(d)
> ItemsView([(3, 'three'), (4, 'four')])
>
> It's not breaking any test (it seems that there isn't any for this), but
> it have a real drawback: it's breaking the convention about instantiation
> by copy/pasting:
>
> >>> ValuesView(['three', 'four'])
> Traceback (most recent call last):
>   File "/usr/lib/python3.6/site-packages/IPython/core/formatters.py",
> line 684, in __call__
>     return repr(obj)
>   File "/usr/lib/python3.6/_collections_abc.py", line 706, in __repr__
>     elements = ', '.join(map(repr, self))
>   File "/usr/lib/python3.6/_collections_abc.py", line 764, in __iter__
>     yield self._mapping[key]
> TypeError: list indices must be integers or slices, not str
>
>
> It's because __init__ in MappingView treat the passed argument -- wich is
> stored in self._mapping -- as the whole mapping, not just keys, values or
> items... And all the other methods (__contains__ and __iter__) in the
> subclasses are using this _mapping attribute to work.
>
>
> So what is to prioritize?
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>



-- 
--Guido van Rossum (python.org/~guido)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20171230/37119e1a/attachment.html>


More information about the Python-ideas mailing list