[C++-sig] pybindgen: Why do wrapped C++ containers not look more like python containers?
J. Michael Owen
mikeowen at llnl.gov
Fri Jun 5 18:49:48 CEST 2009
Hi Taner,
Thanks for the suggestion! I actually was trying the same solution,
except I wasn't sure how to handle the iterators. I'll try it out as
you do in your example -- are you able to iterate over the vector in
python the usual way? As in "for x in vec:"?
Two curious things I noted about wrapping "std::vector" myself:
1. I can't seem to get indexing access to work, even though I wrap an
indexing operation with the python name "__getitem__"
2. I also can't get python's len function to work, even if I provide
"__len__" as follows:
veci.add_method("size", "int", [], custom_name="__len__")
Have you been able to make either of those methods work?
Thanks!
Mike.
On Jun 4, 2009, at 11:42 PM, Taner Yildirim wrote:
> Dear Mike,
>
> Concerning your question about add_method for stl_vector, I was able
> to add
> almost all standard methods of std_vector by simply wrapping the
> std::vector without
> even using the mod.add_container!! Since I am very new to pybindgen,
> I am not sure if there is anything wrong with this approach but it
> seems to work quite well.
> Hopefully Gustava can comment on this more:
>
>
> In summary, here’s how I get the std::vector<int> work in python
> using pybindgen without add_container:
>
> >>>>>>>>> THIS is the header file: tst1.h <<<<<<<<<
>
> #include<vector>
> #include <iostream>
> typedef std::vector<int> VecI;
> typedef std::vector<int>::iterator Iter_VecI;
> #here you can do typdef for other types like double, string, etc
> >>>>>>> END OF THE HEADER FILE <<<<<<<<<<<<<<<<<<<<
>
>
> And here's the pybind-gen code to generate the wrapper.cpp
>
> >>>>>>>>>>>>>> wrap.py <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>
> import sys,pybindgen
> from pybindgen import ReturnValue, Parameter, Module, Function,
> FileCodeSink
>
> def my_module_gen(file_out):
> mod=Module('tst1')
> mod.add_include('"tst1.h"')
> iter_veci=mod.add_class('Iter_VecI')
> #
> veci=mod.add_class('VecI')
> veci.add_constructor([])
>
> veci
> .add_constructor
> ([Parameter.new('int','size'),Parameter.new('int','val' )])
> veci.add_constructor([Parameter.new('VecI','vec_int')])
> veci.add_method('begin','Iter_VecI',[])
> veci.add_method('end','Iter_VecI',[])
>
> veci
> .add_constructor
> ([Parameter
> .new('Iter_VecI','begin'),Parameter.new('Iter_VecI','end')])
> veci.add_method('push_back','void',
> [Parameter.new('int','value')])
> veci.add_method('size',ReturnValue.new('int'),[])
> veci.add_method('pop_back','void',[])
> veci.add_method('at',ReturnValue.new('int'),
> [Parameter.new('int','index')])
> veci.add_method('front',ReturnValue.new('int'),[])
> veci.add_method('back',ReturnValue.new('int'),[])
> veci.add_method('clear','void',[])
> veci.add_method('empty',ReturnValue.new('bool'),
> [],is_const=True)
> veci.add_binary_comparison_operator('==')
> mod.generate(file_out)
>
> my_module_gen(sys.stdout)
>
> >>>>>>>>>>> END OF THE WRAPPER CODE <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>
> Here’s a simple shell script to generate the code
> (I generate pyd since I work in mingw envirentment):
>
> >>>>>>>>> simple shell script to generate the library <<<<<<<<<
> rm tst1.pyd wrap.cpp
> python wrap.py > wrap.cpp
> g++ -c wrap.cpp -IC:/Python25/include
> g++ -shared -o tst1.pyd wrap.o -LC:/Python25/libs -lpython25
> #
> >>>>>>>>>>> end of the script <<<<<<<<<<
>
> Here’s the usage of the tst1.pyd in python:
>
> >>> from tst1 import *
> >>> dir()
> ['Iter_VecI', 'VecI', '__builtins__', '__doc__', '__name__']
> >>> a=VecI() # default constructor
> >>> a.size() # check the size
> 0
> >>> a.push_back(2) # add an entry
> >>> a.size()
> 1
> >>> a.at(0) # get the value at entry index 0
> 2
> >>> a.push_back(2)
> >>> a.push_back(3)
> >>> a.size()
> 3
> >>> b=VecI(a.begin(),a.end()) #constructor using iterator
> >>> b.size()
> 3
> >>> a==b # check if they are the same
> True
> >>> b.push_back(1)
> >>> b.size()
> 4
> >>> a==b
> False
> >>> b.clear()
> >>> b=VecI(4,10) # constructor for 4 entry with value of 10
> >>>
> >>> c=VecI(a) #contructor from an other vector
> >>> c==a
> True
> >>> c.pop_back()
> >>> c==a
> False
> >>> a.empty()
> False
> >>> a.clear()
> >>> a.empty()
> True
> >>>
> >>>>>>>>>>> SOME COMMENTS <<<<<<<<<<<<<<<<<<<<<<<<<
>
> Needless to say, one can simple change the type “int” in the wrapper
> code to double, float, etc and everything works for that type.
> Ideally, I would like to have this sort of wrapper header file
> included in pybindgen for a generic type TTTT and then we can simply
> specify what type TTT we want (like TTT=[‘int’,’float’, ‘string’])
> and then pybindgen could just automatically generate the each
> template with the requested type in the wrapper code!!! Anyway, this
> would be my solution until the pybindgen container will have all the
> standards methods implemented!!!
>
> QUESTION: In this approach, Is it possible to add a custom
> constructor (in the python end)
> such as a=VecI([a python list of integer])??? And how do I get a
> python list from my VecI object using list??
> I guess implementing these two things are not easy and probably
> that’s why we have the
> pybindgen-container module at first place!!!
>
> Anyway, hope what I wrote above is not a total non-sense (which is
> quite possible considering I have only a week experience wit
> pybindgen!!!).
>
> Best regards
> Taner
>
> ********************************************************************************
> Dr. Taner Yildirim, Ph.D. Physicist,
> Adjunct Associate Professor,
> Materials Science and Engineering,
> University of Pennsylvania
> and
> Computational and Neutron Science Team Leader,
> NIST Center for Neutron Research,
> National Institute of Standards and Technology,
> 100 Bureau Drive, Gaithersburg, MD 20899-6100.
> Email: taner at nist.gov or taner at seas.upenn.edu
> PHONE: 301-975-6228 FAX : 301-921-9847
> Web : http:// webster.ncnr.nist.gov/staff/taner
> ********************************************************************************
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/cplusplus-sig/attachments/20090605/2c4a1919/attachment-0001.htm>
More information about the Cplusplus-sig
mailing list