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

Yahya Abou 'Imran yahya-abou-imran at protonmail.com
Sat Dec 30 19:18:06 EST 2017

=== 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? 

More information about the Python-ideas mailing list