[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