A.T.Hofkamp wrote: > 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 > > # 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__ > self.__delattr__ = self.mydict.__delattr__ > self.__delitem__ = self.mydict.__delitem__ > #self.__doc__ = self.mydict.__doc__ > self.__eq__ = self.mydict.__eq__ > self.__ge__ = self.mydict.__ge__ > self.__getattribute__ = self.mydict.__getattribute__ > self.__getitem__ = self.mydict.__getitem__ > self.__gt__ = self.mydict.__gt__ > self.__hash__ = self.mydict.__hash__ > #self.__init__ = self.mydict.__init__ > self.__iter__ = self.mydict.__iter__ > self.__le__ = self.mydict.__le__ > self.__len__ = self.mydict.__len__ > self.__lt__ = self.mydict.__lt__ > self.__ne__ = self.mydict.__ne__ > #self.__new__ = self.mydict.__new__ > self.__reduce__ = self.mydict.__reduce__ > self.__reduce_ex__ = self.mydict.__reduce_ex__ > self.__repr__ = self.mydict.__repr__ > self.__setattr__ = self.mydict.__setattr__ > self.__setitem__ = self.mydict.__setitem__ > self.__str__ = self.mydict.__str__ > self.clear = self.mydict.clear > self.copy = self.mydict.copy > self.fromkeys = self.mydict.fromkeys > self.get = self.mydict.get > self.has_key = self.mydict.has_key > self.items = self.mydict.items > self.iteritems = self.mydict.iteritems > self.iterkeys = self.mydict.iterkeys > self.itervalues = self.mydict.itervalues > self.keys = self.mydict.keys > self.pop = self.mydict.pop > self.popitem = self.mydict.popitem > self.setdefault = self.mydict.setdefault > self.update = self.mydict.update > self.values = self.mydict.values > > # end of __init__ > > if __name__ == '__main__': > fd = myowndict({1:10}) > print 1 in fd # FAILS! (with "TypeError: iterable argument required") > -------------------------------- > > I wanted to make my own dictionary. However, a simple element test failed > (after implementing various __*__ functions), and I cannot figure out why. > > The above code is a brute force attempt, where I forward all methods (except > __class__, __doc__, __init__, and __new__) to my local 'mydict' object. > > IT STILL FAILS. > > So if copying all methods of a native dictionary is not enough, what should I > do to make my class work as a dictionary WITHOUT deriving from dict (which > will > obviously work). > You have to overwrite the "__new__" method to return an object of your new type.
regards Steve -- Steve Holden +1 571 484 6266 +1 800 494 3119 Holden Web LLC/Ltd http://www.holdenweb.com Skype: holdenweb http://del.icio.us/steve.holden Sorry, the dog ate my .sigline -- http://mail.python.org/mailman/listinfo/python-list