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

lucas lucas.bourneuf at laposte.net
Tue Feb 28 19:16:21 EST 2017


I would be very happy to see a frozendict in collections :)

Just for curiosity ; apart caching, is there any optimization
that can be done on a frozendict implementation (over dict) ?

I wonder if frozendict would be implemented as dict without modification
methods, or as a particular object that by design does not easily allow
modifications.



On 28/02/2017 21:05, Matt Gilson wrote:
> 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/
>>
> 
> 
> 
> 
> 
> _______________________________________________
> 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/
> 

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20170301/6ea506fc/attachment.sig>


More information about the Python-ideas mailing list