[ZODB-Dev] How to check for setting the same values on persistent objects?

Hanno Schlichting hanno at hannosch.eu
Fri May 6 04:02:13 EDT 2011


On Thu, May 5, 2011 at 6:27 PM, Alexandre Garel <alex.garel at tarentis.com> wrote:
>> I'm assuming doing a general check for "old == new" is not safe, as it
>> might not be implemented correctly for all objects and doing the
>> comparison might be expensive.
>
> I know very few of ZODB internals but in Python "old == new" does not
> means "old is new"

Sure, but we aren't interested in object identity here. We want to
know if something close to "cPickle.dumps(old_data, 1) ==
cPickle.dumps(new_data, 1)", for which "old_data == new_data" is an
approximation, but likely not correct in all cases. Checking for
identity would only work for ints, interned strings a very few other
things.

> I don't know the way ZODB retrieve a particular object exactly but I
> assume it does this using _p_oid. So for persistant classes you could
> check old._p_oid == new._p_oid. For string, int you can of course use
> old is new.

The _p_oid of the object stays the same, it's the data it represents
that might change.

Hanno


More information about the ZODB-Dev mailing list