Diez B. Roggisch wrote: > Ron Garret wrote: >> Is this a bug or a feature? >> >> class mydict(dict): >> def __setitem__(self, key, val): >> print 'foo' >> dict.__setitem__(self, key, val) >> >> >>>>>d=mydict() >>>>>d[1]=2 >> >> foo >> >>>>>d.setdefault(2,3) > > > Feature. If it wouldn't bypass __setitem__, how exactly would you make a > default-item? Using __setitem__ implies a key. So if setdefault > was implemented as > > def setdefault(self, v): > self["SOME_DEFAULT_KEY_NAME"] = v > > and later on one writes e.g. a HTML-page with a form input field named > "SOME_DEFAULT_KEY_NAME" that gets stored in a dict - it would overwrite > the default value. > > So it has to bypass __setitem__, as otherwise it can't distinguish > between "real" and the default value - the latter one is not allowed to > have a key that is in any imaginable way used by the user.
The implementation is certainly a design decision. setdefault() could be implemented in terms of __set/getitem__() as def setdefault(self, key, value=None): try: return self[key] except KeyError: self[key] = value return self[key] I guess it's not done for performance reasons. Peter -- http://mail.python.org/mailman/listinfo/python-list