how to detect if a dictionary has been modified ?

Arnaud Delobelle arnodel at googlemail.com
Sun Nov 23 12:50:35 EST 2008


Glenn Linderman <v+python at g.nevcal.com> writes:

> On approximately 11/23/2008 1:40 AM, came the following characters
> from the keyboard of Steven D'Aprano:
>> On Sun, 23 Nov 2008 01:18:17 -0800, bearophileHUGS wrote
>>> Stef Mientki:
>>>     
>>>> I would like to detect if a dictionary has been changed. So I would
>>>> like to have a modified-flag.
>>>>       
>>> A solution is of course to create a SDict class, that works like a
>>> normal dict, and also watches for changes and has an extra boolean
>>> attribute.
>>>     
>>
>> What does the S stand for?
>>
>> Untested and possibly incomplete:
>>
>> def factory(methodname, cls=dict, flag=True):
>>     def method(self, *args, **kwargs):
>>         self.modified = flag
>>         return getattr(cls, methodname)(self, *args, **kwargs)
>>     return method
>>
>>
>> class SDict(dict):
>>     __init__ = factory('__init__', flag=False)
>>     __setitem__ = factory('__setitem__')
>>     __delitem__ = factory('__delitem__')
>>     clear = factory('clear')
>>     pop = factory('pop')
>>     popitem = factory('popitem')
>>     setdefault = factory('setdefault')
>>     update = factory('update')
>>   
>
> Interesting technique.  I must point out, though, that it doesn't
> indicate if a dict has been changed, only that potentially changing
> operations have been performed.  So it really depends on what Stef
> originally meant by changed, and perhaps what is meant by == :)
>
> x = {'a', 3}

You mean x = {'a': 3}!

> x['a'] = 3
>
> Whether x has been changed by the second statement is the open
> question.  The above code would declare it has, but most people, when
> shown before and after copies of the dict, with declare it hasn't.

Good point.  What about

>>> d = {1: []}
>>> d[1].append(2)

Has d changed or not?

-- 
Arnaud



More information about the Python-list mailing list