Apparently an extension type subclass will only inherit its base
class rich comparison function if the subclass does not define a hash
function. This is a CPython thing that has nothing to do with Pyrex.
I had to look at the Python interpreter source code to discover what
was happening.

Two other things. First it is dangerous to cast an object pointer to
something else. No type checking is done by Pyrex so this could lead
to incorrect memory accesses. Second, if your type does not support a
particular kind of comparison then __richcmp__ should return
NotImplemented, a builtin object. This lets Python try other
comparisons. So your comparison function should look like something
like this:

      def __richcmp__(x, y, case):
          print "__richcmp__"
          cdef Base self, other
          try:
              self = x
              other = y
              if case == 2:
                  return bool(self.a == other.a)
          except TypeError:
              pass
          return NotImplemented

Of cource you might also want to implement != as well.

Lenard Lindstrom
<len-l@telus.net>