[ZODB-Dev] Re: trigger loading a Persistent's attributes

Miles miles at jamkit.com
Tue Jan 30 04:44:03 EST 2007


Simon Burton wrote:
> On Sun, 28 Jan 2007 19:00:33 +0100
> "Dieter Maurer" <dieter at handshake.de> wrote:
> 
>> Simon Burton wrote at 2007-1-27 15:18 -0800:
>>> I have a Persistent object, however, its attributes only
>>> get loaded from the storage when I request a specific attribute.
>>> Problem is, I don't know the names of the attributes 
>>> necessarily. I was trying to just query the __dict__ but
>>> this does not trigger a load. Is there another way to do this ?
>> Accessing (almost) any attribute (even a non existing one) will load
>> the object. There are a few exceptions: attributes starting with "_p_"
>> or "_v_".
>>
> 
> Yes. I looked at the dir function, it seems that when it accesses the "__members__"
> attribute this triggers a load.
> 
> This is ZODB-fu. So be it.
> 

Broadly, if you just request an object (rather than a method or 
attribute), then the ZODB returns a 'ghost' object.  The ghost object is 
transformed into the real object once a method or attribute are used.

If you have a persistent object that you think is a ghost, you can call 
_p_activate() on it.  That will load __dict__ and turn it into the full 
object for you to use as you want.

At least, that's what I've found - if this is wrong then someone should 
speak up!

Miles




More information about the ZODB-Dev mailing list