On Tue, Jun 19, 2012 at 01:54:21PM -0400, Claudiu Saftoiu wrote: > Ideally I could do something like this: > > class Foo(Persistent): > def __init__(self, a): > self.a = a > self.b_cache = PersistentDict() > > def __just_loaded__(self): > if not hasattr(self, 'b_cache'): self.b_cache = PersistentDict() > > def calc_it(self, b): > > if b in self.b_cache: return self.b_cache[b] > res = expensive_function(a, b) > self.b_cache[b] = res > return res > > That is, a function called whenever the object is loaded, that does > all the necessary backwards-compatibility work right there. It > separates the backwards-compat code cleanly, and also only updates the > objects as-needed... though still a minor performance hit as it does > the check each time the object is loaded. > > Is there a way to do that last option?
Yes, you can override __setstate__: def __setstate__(self, state): super(Foo).__setstate__(self, state) if not hasattr(self, 'b_cache'): self.b_cache = PersistentDict() This assumes you haven't been defining other pickling protocol functions like __reduce__, and so cPickle -- which is the foundation of ZODB -- uses the usual __getstate__/__setstate__ pair. > What's the best practice for this sort of thing, in general? It depends. :-) If the new attribute is immutable, you can set it as a class attribute. If it's easy to locate all Foo objects in your DB, you may want to write a generation script (see http://pypi.python.org/pypi/zope.generations) and do the migration once, instead of paying the cost of checking for missing attributes on every single object load. It's also best to avoid write-on-read semantics, because those tend to cause database growth and increase the chances of getting ConflictErrors. Marius Gedminas -- An expert is a person who has made all the mistakes that can be made in a very narrow field. -- Niels Bohr
signature.asc
Description: Digital signature
_______________________________________________ For more information about ZODB, see http://zodb.org/ ZODB-Dev mailing list - ZODB-Dev@zope.org https://mail.zope.org/mailman/listinfo/zodb-dev