[ZPatterns] Problem in latest ZPatterns: setattr, id, etc.

Steve Alexander steve@cat-box.net
Thu, 26 Jul 2001 18:56:39 +0100


There's a problem with the latest ZPatterns. I'm only using Zope 2.4 
now, so I can't easily verify that there's a problem on earlier Zopes.

The problem is with DataSkin.py

The old __init__ method looks like this:

   def __init__(self, id):
       # Bypass attribute providers for setting up initial id,
       # since they need the id in order to work!
       self.__dict__['id']=id; self._p_changed = 1

This is changed to:

   def __init__(self, id=None):
       # we could ditch this whole method except for backward
       # compatibility  :(
       pass

However, the start of __setattr__ still looks like this:

   def __set_attr__(self,name,val,_v_dm_=_v_dm_):
        try:
            dm = self.__dict__[_v_dm_]
        except KeyError:
            if name=='id' and val==self.__dict__['id']: return
            raise

        self = self._canonicalForm()

The problem is that the above code gets called before __of__ has been 
called, so there is no _v_parent, so you get a KeyError looking up 
__dict__[_v_parent] in the _canonicalForm method of DataSkin.

I think the start of __set_attr__ should look like this:

   def __set_attr__(self,name,val,_v_dm_=_v_dm_):
        try:
            dm = self.__dict__[_v_dm_]
            self = self._canonicalForm()
        except KeyError:
            if name in ('id', '__name__'):
                self.__dict__[name]=val
                self._p_changed = 1
                return
            raise

        self._objectChanging(name)

--
Steve Alexander
Software Engineer
Cat-Box limited