Hi, I have been writing a new C api that can build with both python 2.6 and 3.0

I found that when building with python 2.6, doing "a==b" between 2
different pyrna_struct_Type's would run tp_compare

But with python 3.0, "a==b" will always be false and tp_compare
function would not even run.
The only way to get it to run the tp_compare function was to do
"cmp(a, b)" however Id like to be able to use == still.

The only way I could get "a==b" to work in python 3.0 was to add a
tp_richcompare function which runs tp_compare with Py_CmpToRich()
anyway

Is this the intended behavior? - if so its important for external C
API's to be updated to support this.

Included the PyType below with some relevant details. I looked at
other Python 3.0 types but could not see why this would happen.


// ----snip,
//  initialized with PyType_Ready

        if( PyType_Ready( &pyrna_struct_Type ) < 0 )
                return NULL;

// header definition for BPy_StructRNA

typedef struct {
        PyObject_HEAD /* required python macro   */
        PointerRNA ptr;
        int freeptr; /* needed in some cases if ptr.data is created on the
fly, free when deallocing */
} BPy_StructRNA;

// PyType

/*-----------------------BPy_StructRNA method
def------------------------------*/
PyTypeObject pyrna_struct_Type = {
        PyVarObject_HEAD_INIT(NULL, 0)
        "StructRNA",                    /* tp_name */
        sizeof( BPy_StructRNA ),        /* tp_basicsize */
        0,                      /* tp_itemsize */
        /* methods */
        ( destructor ) pyrna_struct_dealloc,/* tp_dealloc */
        NULL,                       /* printfunc tp_print; */
        NULL,                                           /* getattrfunc 
tp_getattr; */
        NULL,                                           /* setattrfunc 
tp_setattr; */
        ( cmpfunc ) pyrna_struct_compare,       /* tp_compare */
        ( reprfunc ) pyrna_struct_repr, /* tp_repr */

        /* Method suites for standard classes */

        NULL,                       /* PyNumberMethods *tp_as_number; */
        NULL,                                           /* PySequenceMethods 
*tp_as_sequence; */
        NULL,                                           /* PyMappingMethods 
*tp_as_mapping; */

        /* More standard operations (here for binary compatibility) */

        ( hashfunc )pyrna_struct_hash,  /* hashfunc tp_hash; */
        NULL,                                           /* ternaryfunc tp_call; 
*/
        NULL,                       /* reprfunc tp_str; */
        ( getattrofunc ) pyrna_struct_getattro, /* getattrofunc tp_getattro; */
        ( setattrofunc ) pyrna_struct_setattro, /* setattrofunc tp_setattro; */

        /* Functions to access object as input/output buffer */
        NULL,                       /* PyBufferProcs *tp_as_buffer; */

  /*** Flags to define presence of optional/expanded features ***/
        Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,         /* long tp_flags; */

        NULL,                                           /*  char *tp_doc;  
Documentation string */
  /*** Assigned meaning in release 2.0 ***/
        /* call function for all accessible objects */
        NULL,                       /* traverseproc tp_traverse; */

        /* delete references to contained objects */
        NULL,                       /* inquiry tp_clear; */

  /***  Assigned meaning in release 2.1 ***/
  /*** rich comparisons ***/
        (richcmpfunc)pyrna_struct_richcmp,      /* richcmpfunc tp_richcompare; 
*/

  /***  weak reference enabler ***/
        0,                          /* long tp_weaklistoffset; */

  /*** Added in release 2.2 ***/
        /*   Iterators */
        NULL,                       /* getiterfunc tp_iter; */
        NULL,                       /* iternextfunc tp_iternext; */

  /*** Attribute descriptor and subclassing stuff ***/
        pyrna_struct_methods,           /* struct PyMethodDef *tp_methods; */
        NULL,                       /* struct PyMemberDef *tp_members; */
        NULL,                                           /* struct PyGetSetDef 
*tp_getset; */
        NULL,                       /* struct _typeobject *tp_base; */
        NULL,                       /* PyObject *tp_dict; */
        NULL,                       /* descrgetfunc tp_descr_get; */
        NULL,                       /* descrsetfunc tp_descr_set; */
        0,                          /* long tp_dictoffset; */
        NULL,                       /* initproc tp_init; */
        NULL,                       /* allocfunc tp_alloc; */
        pyrna_struct_new,                       /* newfunc tp_new; */
        /*  Low-level free-memory routine */
        NULL,                       /* freefunc tp_free;  */
        /* For PyObject_IS_GC */
        NULL,                       /* inquiry tp_is_gc;  */
        NULL,                       /* PyObject *tp_bases; */
        /* method resolution order */
        NULL,                       /* PyObject *tp_mro;  */
        NULL,                       /* PyObject *tp_cache; */
        NULL,                       /* PyObject *tp_subclasses; */
        NULL,                       /* PyObject *tp_weaklist; */
        NULL
};



-- 
- Campbell
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to