[Python-Dev] Add a frozendict builtin type

Serhiy Storchaka storchaka at gmail.com
Thu Mar 1 18:56:38 CET 2012


01.03.12 16:47, André Malo написав(ла):
> On Thursday 01 March 2012 15:17:35 Serhiy Storchaka wrote:
>> This is the first rational use of frozendict that I see. However, a deep
>> copy is still necessary to create the frozendict. For this case, I
>> believe, would be better to "freeze" dict inplace and then copy-on-write
>> it.
> In my case it's actually a half one. The data mostly comes from memcache ;)
> I'm populating the object and then I'm done with it. People wanting to modify
> it, need to copy it, yes. OTOH usually a shallow copy is enough (here).

What if people modify dicts in deep?

 a = frozendict({1: {2: 3}})
 b = a.copy()
 c = a.copy()
 assert b[1][2] == 3
 c[1][2] = 4
 assert b[1][2] == 4

You need to copy incoming dict in depth.

 def frozencopy(value):
     if isinstance(value, list):
         return tuple(frozencopy(x) for x in value)
     if isinstance(value, dict):
         return frozendict((frozencopy(k), frozencopy(v)) for k, v in value.items())
     return value # I'm lucky

And when client wants to modify the result in depth it should call "unfrozencopy". Using frozendict profitable only when multiple clients are reading the result, but not modify it. Copy-on-write would help in all cases and would simplify the code. But this is a topic for python-ideas, sorry.



More information about the Python-Dev mailing list