[C++-sig] Dynamic resolution of members and methods
jeremie.delaitre at technogerma.fr
Mon Dec 15 13:58:29 CET 2008
When defining my new type in C++, I have set the "tp_getattro" field to
point to a function (say "mytype_getattro").
This function determine dynamically if the requested attribute exists or
not, and if it does, return its value.
So, it works well for attributes/properties.
But, "mytype_getattro" is also called when, in Python, I do a function
call 'myobject.myfct(...)'. It allows me to determine
dynamically if the requested function "myfct" is available or not. But
if it does, I need to return a callable object to allow
python to process the call.
I succeeded to make Python to call a function of mine using a
PyMethodDef array and using the Py_FindMethod function
to get a callable PyObject*.
But it is not a good solution for at least two reasons :
1 - Py_FindMethod is not supported in Python 3.0
2 - I need to declare each possible function in the array (which is
impossible has I need to determine them at runtime)
What I have tried to do is to declare only one "dipatch" function in the
array which will call the right C++ function.
This way, in "mytype_getattro" I do a "return Py_FindMethod(myarray,
self, "dispatch")". Thus, python call my
dispatching method. The problem is that I need to attach additionnal
values to the function (like the name of the function
which must be called in reality). In Lua, I used the closure mechanism,
but I did not success with Python closures.
Any hints ?
Is closure the right approach (If so, how I should use it ?)? Do I need
to set another field when defining my type ?
Jérémie Delaitre a écrit :
> It works ! Thanks a lot.
> Alex Mohr a écrit :
>> Override the python special methods __getattr__ or __getattribute__.
>> Jérémie Delaitre wrote:
>>> I have a C++ class that use a custom property system.
>>> This property system allows me to add and remove properties at runtime.
>>> I want to expose this class into Python.
>>> The problem is: I want "a dynamic resolution" of the properties in
>>> For example:
>>> # import my python extension
>>> import myModule
>>> # get an instance of my C++ class
>>> t = myModule.newInstance()
>>> # access the property 'myProperty'
>>> When I access the property, I want python to call a "callback" of
>>> mine (written
>>> in the C++ extension) which will check if the requested property
>>> exists, and
>>> if it does, return the corresponding value, otherwise generate an
>>> By looking at the python C API, I did not find a way to achieve
>>> this. It seems
>>> that declaring a new type requires to have static arrays for members
>>> and methods
>>> (yes, my property system allows me to declare new methods too, so I
>>> want to expose
>>> them with a similar system).
>>> Any idea how I could resolve this (with Python3.0) ?
>>> Jérémie Delaitre
>>> Cplusplus-sig mailing list
>>> Cplusplus-sig at python.org
>> Cplusplus-sig mailing list
>> Cplusplus-sig at python.org
> Cplusplus-sig mailing list
> Cplusplus-sig at python.org
More information about the Cplusplus-sig