## 2.2.4 Object Comparison

        cmpfunc tp_compare;

The `tp_compare` handler is called when comparisons are needed and the object does not implement the specific rich comparison method which matches the requested comparison. (It is always used if defined and the `PyObject_Compare()` or `PyObject_Cmp()` functions are used, or if `cmp()` is used from Python.) It is analogous to the `__cmp__()` method. This function should return `-1` if obj1 is less than obj2, `0` if they are equal, and `1` if obj1 is greater than obj2. (It was previously allowed to return arbitrary negative or positive integers for less than and greater than, respectively; as of Python 2.2, this is no longer allowed. In the future, other return values may be assigned a different meaning.)

A `tp_compare` handler may raise an exception. In this case it should return a negative value. The caller has to test for the exception using `PyErr_Occurred()`.

Here is a sample implementation:

    static int
    newdatatype_compare(newdatatypeobject * obj1, newdatatypeobject * obj2)
    {
        long result;

        if (obj1->obj_UnderlyingDatatypePtr->size <
            obj2->obj_UnderlyingDatatypePtr->size) {
            result = -1;
        }
        else if (obj1->obj_UnderlyingDatatypePtr->size >
                 obj2->obj_UnderlyingDatatypePtr->size) {
            result = 1;
        }
        else {
            result = 0;
        }
        return result;
    }