[ZODB-Dev] Re: getting the object ID (_p_oid attribute)

Gary Poster gary at zope.com
Mon Jun 26 15:19:57 EDT 2006


On Jun 26, 2006, at 3:16 PM, Florent Guillaume wrote:

> On 26 Jun 2006, at 21:11, Robert Gravina wrote:
>> On 2006/06/27, at 3:49, Benji York wrote:
>>> Robert Gravina wrote:
>>>> I just tried loading a persisted  object interactively and  
>>>> noticed that although the _p_oid doesn't  print out as anything  
>>>> (and hence I always thought it was empty in my  debugging  
>>>> prints), it isn't actually None! Can anyone explain this?  (here  
>>>> "p" is my persisted object)
>>>>  >>> p._p_oid
>>>> '\x00\x00\x00\x00\x00\x00\x00\x08'
>>>>  >>> print p._p_oid
>>>>  >>> p._p_oid is None
>>>> False
>>>
>>> What would you expect to see if you printed out seven null  
>>> characters and a backspace?
>>
>> Hahaha - that's a good point! I was expecting IDs to look, well,  
>> something like "asdf23asdf". Well, anyway thankyou! I seemed to  
>> have solved this problem. I was able to write a __eq__ function  
>> like this:
>>
>>     def __eq__(self, other):
>>         if isinstance(other, <name of my class>):
>>             if hasattr(other,"_p_oid") and other._p_oid != None  
>> and (other._p_oid == self._p_oid):
>>                 return True
>>             else:
>>                 return False
>>
>> and now can compare objects for equality after the (Twisted)  
>> client edits them and sends them back.
>
> You can shorten that to
> def __eq__(self, other):
>     return aq_base(self) is aq_base(other)

Heh, good point.

> And you can ditch the aq_base if you don't use acquisition-based  
> classes.

(or don't have proxies generally--Zope 3 has a number of them, for  
instance.)

(this wouldn't work if you had the same persistent object from  
different connections...but don't go there!)

Gary


More information about the ZODB-Dev mailing list