[Zope] Zope (X)3 FAQ

Lennart Regebro lennart@regebro.nu
Mon, 07 Apr 2003 10:01:14 +0200


Thomas Guettler wrote:
> I know. __setstate__ is what I called "implicit update". But AFAIK
> objects which are already in memory don't get updated until the next
> time they get unpickeled. That's why I prefere a explicit update. I
> called this method refresh() in my python product.

I agree, it's a good way to do it. I do think a name more unique then 
refresh is good though, because then you can simply traverse the 
hierarchy and call the upgrade method if it exists.

I also make it a habit of letting any upgrade method set a version 
attribute on the object when it upgrades. It should also return 
something useful, like information of if it actually did an upgrade or not.

Like this:

security.declarePrivate('Upgrade Objets', 'UpgradeObjectVersion')
def UpgradeObjectVersion(self):
     """Upgrades the object to new versions"""

     # Check if upgrade is necessary:
     if hasattr(self, '_object_version') and \
        self._object_version == '1.1':
         return 0 #No upgrade

     # Upgrade
     if not hasattr(self, "birthday"):
         self.birthday=0

     # Set version and return success
     self._object_version = '1.1'
     return 1 #Yup, upgraded


[Although in this specific case, I would not check for the 
_object_version to determine if it should be upgraded, I would check for 
the birthday attribute. Ah, well, details... :) ].