Hi

I am trying to create a subclass of a python class, defined in python,
in C++, but I am having some problems. It all boils down to a problem
of finding the base class' type object and according to the PEP (253) I
would also need to figure out the size of the base class instance
structure, but I'm guessing that the latter can't be done in a way that
would allow me to define a structure for my own type.

The following code is what I've tried, which is an adaptation of
http://groups.google.com/group/comp.lang.python/msg/b32952c69182d366

        /* import the module that holds the base class */
        PyObject *code_module = PyImport_ImportModule("code");
        if (!code_module) return;

        /* get a pointer to the base class */
        PyObject *ic_class = PyMapping_GetItemString(
                                        PyModule_GetDict(code_module),
                                        "InteractiveConsole");
        if (!ic_class) return;

        /* assign it as base class */
        // The next line is the original code, but as far as I can understand
        // the docs for Py_BuildValue the code used is equivalent. I find it
        // to be clearer as well.
        // EmConType.tp_bases = Py_BuildValue("(O)", ic_class);

        Py_INCREF(ic_class);
        EmConType.tp_bases = ic_class;

        if (PyType_Ready(&EmConType) < 0)

This breaks an assertion in the function classic_mro called by
PyType_Ready however, specifically that on line 1000 of typeobject.c:
assert(PyClass_Check(cls)). To get there you need to fail PyType_Check
as well and indeed, at least in the debug build, cls.ob_type.tp_name is
"dict". ic_class appears to be a "classobj" before the call to
PyType_Ready. I would of course much rather have seen that it was a
"type", but I'm not sufficiently well versed in the python guts to know
if this is ok or not.

If anyone could please lend me a clue, I'd be terribly happy about it.

Thanks,
Johan

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to