ExtensionClass/Persistent and __cmp__ is tricky
jim at zope.com
Sun Jun 29 14:56:54 CEST 2003
Tim Peters wrote:
> [Christian Reis]
>>It seems you can't compare ExtensionClass with basic types; in Python
>>2.1.3 at least it appears to me that try_3way_compare doesn't want to
>>call tp_compare on the second instance because it's not a PyInstance.
> Possibly so. I don't think anyone really understands the details of
> ExtensionClass except for Jim (Fulton), and his understanding was fresh
> years ago -- ExtensionClass isn't part of Python, it's part of Zope.
ExtensionClass is a type. There's this funny rule for types and
__cmp__ that __cmp__ is only called for types when:
- Comparing objects of the same type or
- One of the types is a number.
Otherwise, Python falls back to address comparison.
This rule is really annoying. You can get around this, as I recall
by implementing some numeric methods (e.g. __nonzero__). That will make
Python call EC's __cmp__ more often.
__cmp__ should be deprecated. Unfortunately, EC doesn't support rich comparisons.
The good news is that soon, ZODB3 will support new-style classes.
Jim Fulton mailto:jim at zope.com Python Powered!
CTO (703) 361-1714 http://www.python.org
Zope Corporation http://www.zope.com http://www.zope.org
More information about the Python-list