A.T.Hofkamp a écrit : > Hello all, > > This morning I tried to create my own read-only dictionary, and failed > miserably. > I don't understand why, can somebody enlighten me? > > Below is a brute-force experiment that cannot deal with "x in obj", plz read > the explanation below the code: > -------------------------------- > class myowndict(object): > def __init__(self, mydict): > self.mydict = mydict
Why don't you just subclass dict and override the needed method(s) ? class ReadOnlyDict(dict): @classmethod def _raise(cls): raise AttributeError("%s is read-only" % cls.__name__) def __setitem__(self, name, val): self._raise() def setdefault(self, name, value=None): self._raise() # TODO : check if I missed some other setter ? def test(d): print d try: d['c'] = 3 except AttributeError, e: print "__setitem__ ok, got : %s" % e else: assert('failed on __setitem__') try: d.setdefault('c', 3) except AttributeError, e: print "setdefault ok, got : %s" % e else: assert('failed on setdefault') if __name__ == '__main__': d1 = ReadOnlyDict(a=1, b=2) test(d1) d2 = ReadOnlyDict({'a':1, 'b':2}) test(d2) d3 = ReadOnlyDict((c, i+1) for i, c in enumerate('ab')) test(d3) d4 = ReadOnlyDict(**d1) test(d4) NB : works fine so far, but choke on fromkeys, which obviously uses __setitem__ > # Below is produced with > # print '\n'.join([' self.%s = self.mydict.%s' % (v,v) > # for v in dir(dict)]) > # commented-out functions done by hand > # > #self.__class__ = self.mydict.__class__ > self.__cmp__ = self.mydict.__cmp__ > self.__contains__ = self.mydict.__contains__ (snip lots of useless code) May I suggest that you learn to use __getattr__ and __setattr__ ?-) HTH -- http://mail.python.org/mailman/listinfo/python-list