[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... :) ].