[EMAIL PROTECTED] said unto the world upon 12/01/06 03:15 AM: > I can think of several messy ways of making a dict that sets a flag if > it's been altered, but I have a hunch that experienced python > programmers would probably have an easier (well maybe more Pythonic) > way of doing this. > > It's important that I can read the contents of the dict without > flagging it as modified, but I want it to set the flag the moment I add > a new element or alter an existing one (the values in the dict are > mutable), this is what makes it difficult. Because the values are > mutable I don't think you can tell the difference between a read and a > write without making some sort of wrapper around them. > > Still, I'd love to hear how you guys would do it. > > Thanks, > -Sandra >
Hi Sandra, here's one attempt. (I'm no expert, so wait for better :-) >>> class ModFlagDict(dict): def __init__(self, *args, **kwargs): super(ModFlagDict, self).__init__(*args, **kwargs) self.modified = False def __setitem__(self, key, value): self.modified = True super(ModFlagDict, self).__setitem__(key, value) >>> md = ModFlagDict(a=4, b=5) >>> md {'a': 4, 'b': 5} >>> md.modified False >>> md[3]=5 >>> md {'a': 4, 3: 5, 'b': 5} >>> md.modified True >>> It's broken in at least one way: >>> newmd = ModFlagDict(3=4, 1=5) SyntaxError: keyword can't be an expression >>> So, as it stands, no integers, floats, tuples, etc can be keys on initialization. I think that can be be worked around by catching the exceptions and setting the desired key-value pairs that way. But, it is almost 4am, and I also suspect there is a much better way I am not thinking of :-) Best, Brian vdB -- http://mail.python.org/mailman/listinfo/python-list