[Python-ideas] Expose a child factory using MappingProxyType in builtins

Matt Gilson matt at getpattern.com
Tue Feb 28 15:05:37 EST 2017


I've implemented `frozendict` a few times for various projects and never
knew about MappingProxyType.  I always used `collections.abc.Mapping` ...


On Tue, Feb 28, 2017 at 9:12 AM, David Mertz <mertz at gnosis.cx> wrote:

> The difference in hits might be because MappingProxyType has a funny name
> and is in a hidden-ish location.  I.e. not necessarily because it *would
> be* less used or useful if it were more exposed.
>
>
It also might be because you can use `frozenset` in python2.x code -- And
there's lots of that lying around...


> In either case, the name that makes sense to me would be `frozendict`.
> That could very well live in `collections` of course.
>

Yes, I agree.  Though it'd also probably need to be hashable if we were to
give it that name.  I'm not 100% sure that `MappingProxyType` works there
as it's just a view into another mapping.  If the first mapping changes, so
does the hash.  This is the same problem we have hashing tuple in some
sense -- But tuple can say "Nope, sorry.  I can't hash this because it's
got an unhashable member".  I don't think we can really do the same thing
with a MappingProxy since most of the time, it'll be constructed from
something else.  I suppose the workaround is pretty simple though:

class frozendict(MappingProxyType):
    def __init__(self, proxy):
        super().__init__(proxy.copy())  # Copy the proxy! -- Maybe need
`copy.copy()` instead?
    def __hash__(self):
        return hash(frozenset(self.items()))

This could likely be done better, but hopefully it gets the idea across...


>
> On Tue, Feb 28, 2017 at 7:40 AM, Ivan Levkivskyi <levkivskyi at gmail.com>
> wrote:
>
>> Searching MappingProxyType on GitHub gives over 10,000 results.
>> I think it probably makes sense to make mappingproxy more "visible",
>> maybe move it to collections module? (where OrderedDict lives)
>>
>> I am not sure if it makes sense to move it to builtins. (for comparison
>> frozenset gives around 1000,000 results)
>>
>> --
>> Ivan
>>
>>
>>
>> On 28 February 2017 at 16:24, Joseph Hackman <josephhackman at gmail.com>
>> wrote:
>>
>>> +1
>>>
>>> I think this makes a lot of sense. What would you name the built in?
>>>
>>> -Joseph
>>>
>>> > On Feb 28, 2017, at 7:17 AM, Michel Desmoulin <
>>> desmoulinmichel at gmail.com> wrote:
>>> >
>>> > We have the immutable frozenset for sets and and tuples for lists.
>>> >
>>> > But we also have something to manipulate dict as immutable
>>> datastructures:
>>> >
>>> >>>> from types import MappingProxyType as idict
>>> >>>> d = idict({'a':1, 'b':2, 'c':3})
>>> >>>> d['a'] = 4
>>> > Traceback (most recent call last):
>>> >  File "<ipython-input-3-c6f93d6278af>", line 1, in <module>
>>> >    d['a'] = 4
>>> > TypeError: 'mappingproxy' object does not support item assignment
>>> >
>>> > We could expose this as a built type to allow the last of the most
>>> > important data structure in Python to be easily immutable.
>>> >
>>> > _______________________________________________
>>> > 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/
>>> _______________________________________________
>>> 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/
>>>
>>
>>
>> _______________________________________________
>> 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/
>>
>
>
>
> --
> Keeping medicines from the bloodstreams of the sick; food
> from the bellies of the hungry; books from the hands of the
> uneducated; technology from the underdeveloped; and putting
> advocates of freedom in prisons.  Intellectual property is
> to the 21st century what the slave trade was to the 16th.
>
> _______________________________________________
> 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/
>



-- 

[image: pattern-sig.png]

Matt Gilson // SOFTWARE ENGINEER

E: matt at getpattern.com // P: 603.892.7736

We’re looking for beta testers.  Go here
<https://www.getpattern.com/meetpattern> to sign up!
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20170228/03fb9001/attachment.html>


More information about the Python-ideas mailing list