[C++-sig] Dynamic resolution of members and methods

Jérémie Delaitre jeremie.delaitre at technogerma.fr
Wed Dec 17 10:07:14 CET 2008


Ok, I have find a way to resolve all of my problem.
I simply declare a new custom type which is callable.
This way, when the user type in python 'myObj.myFunc(...)', 
mytype_getattro is called
with 'myObj' as self and 'myFunc' as arg. Then, I return a new instance 
of the callable type
which is fill with all the information I need to identify the function. 
Then python simply call the
functor.

Jérémie Delaitre


Jérémie Delaitre a écrit :
>
> Hi,
>
> 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 ?
>
> Regards,
>
> Jérémie Delaitre
>
>
> Jérémie Delaitre a écrit :
>>
>> It works ! Thanks a lot.
>>
>> Jérémie
>>
>> Alex Mohr a écrit :
>>> Override the python special methods __getattr__ or __getattribute__.
>>>
>>> http://docs.python.org/reference/datamodel.html#attribute-access
>>>
>>> Alex
>>>
>>> Jérémie Delaitre wrote:
>>>> Hello,
>>>>
>>>> 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 
>>>> Python.
>>>>
>>>> For example:
>>>>
>>>> # import my python extension
>>>> import myModule
>>>>
>>>> # get an instance of my C++ class
>>>> t = myModule.newInstance()
>>>>
>>>> # access the property 'myProperty'
>>>> print(t.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 
>>>> exception.
>>>>
>>>> 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) ?
>>>>
>>>> Regards,
>>>>
>>>> Jérémie Delaitre
>>>>
>>>>
>>>> _______________________________________________
>>>> Cplusplus-sig mailing list
>>>> Cplusplus-sig at python.org
>>>> http://mail.python.org/mailman/listinfo/cplusplus-sig
>>>
>>> _______________________________________________
>>> Cplusplus-sig mailing list
>>> Cplusplus-sig at python.org
>>> http://mail.python.org/mailman/listinfo/cplusplus-sig
>>>
>>
>>
>> _______________________________________________
>> Cplusplus-sig mailing list
>> Cplusplus-sig at python.org
>> http://mail.python.org/mailman/listinfo/cplusplus-sig
>>
>
>
> _______________________________________________
> Cplusplus-sig mailing list
> Cplusplus-sig at python.org
> http://mail.python.org/mailman/listinfo/cplusplus-sig
>




More information about the Cplusplus-sig mailing list