[PEAK] very elementary peak.model question
Phillip J. Eby
pje at telecommunity.com
Wed Jul 14 17:58:50 EDT 2004
At 04:35 PM 7/14/04 -0500, Doug Quale wrote:
>I tried LazyLoader with a model.Sequence feature and unless I'm doing
>something wrong it doesn't work. (It works fine with model.Attribute.)
>This is a silly example, but it's short:
>
> >>> from peak.api import *
> >>> class bar(model.Element):
> class x(model.Sequence):
> pass
>
> >>> class lazy(storage.LazyLoader):
> def load(self, ob, attr):
> setattr(ob, attr, (1, 2))
>
> >>> b = bar()
> >>> b.x = lazy()
Don't use setattr in the lazy loader. You *must* set directly into the
object's dictionary, or call the slot's __set__ method if the attribute is
stored in a slot rather than __dict__.
Also, don't use 'b.x =' to set the lazy loader into the object
either. Again, this should be via the dictionary.
Remember that lazy loaders and object state are part of the implementation
of model elements, not a part of their interface.
(Frankly, I'm surprised you got it to work with model.Attribute; it's
purely accidental that it happens to at the moment.)
Normally, the place where LazyLoaders are used is in a DM's '_load()'
method, returned as part of a state dictionary that gets stuffed into the
object.
More information about the PEAK
mailing list