Hi All,

I'm trying to write in python a object implementing several GInterfaces. My problem is that several functions in these interfaces have the same name. By example I have something like:

In IDebuggerFrame
        void list(void)         // List all frames
In IDebuggerBreakpoint
        void list(void)         // List all breakpoints

In C, these functions are called with
        void idebugger_frame_list(IDebuggerFrame *obj)
        {
                IDEBUGGER_FRAME(obj)->list();
        }
        void idebugger_breakpoint_list(IDebuggerBreakpoint *obj)
        {
                IDEBUGGER_BREAKPOINT(obj)->list();
        }
There is no problem here, an object implementing both interfaces will have 2 different structure with a list member in each one.

In python, the wrapper of both interfaces will look for the same do_list method.

I can override both do_list methods to use a different function in both case by example do_list_frame and do_list_breakpoint here. But then I have a problem in the function initializing the interface __IDebuggerBreakpoint__interface_init.

There is a code like the following:
py_method = pytype? PyObject_GetAttrString((PyObject *) pytype, "do_list") : NULL;
    if (py_method && !PyObject_TypeCheck(py_method, &PyCFunction_Type)) {
        iface->list = wrap_IDebuggerBreakpoint__proxy_do_list;
    } else {
        PyErr_Clear();
        if (parent_iface) {
            iface->list = parent_iface->list;
        }
    Py_XDECREF(py_method);

This code is generated in codegen.py in write_virtuals function. The "do_list" string is generated by adding "do_" to the function name. And this function name is used to name the iface field.

What is the best way to handle this ?

I can think about a few solutions.

1. Add in the .defs file another name, let's call it python name, like we already have c name and use it instead of do_* name. If this name is not defined generates a name adding "do_" before the function name like now. I can write a patch for this.

2. Allow to override the __IDebuggerBreakpoint__interface_init function, so I can provide another implementation of this function, using more complex name. I have tried a bit but didn't succeed perhaps it's already possible. I need to override all functions using a special name too. Perhaps I can simply not use codegen for these interfaces and write everything by hand.

3. Rename my GInterface function in the C code. It's the easiest solution, but the function name is C will be very long and I would prefer to handle problem added by the python wrapper in python code.

Regards,

Sébastien
_______________________________________________
pygtk mailing list   [email protected]
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/

Reply via email to