Boost logo

Boost :

Subject: [boost] [python] Making a Python tuple from a Fusion sequence
From: Bruno Lalande (bruno.lalande_at_[hidden])
Date: 2009-02-23 06:32:38


Hello,

I have written a little function that converts any Boost.Fusion
sequence into a Python tuple (boost::python::tuple). If a sub-sequence
is nested in the sequence, the result will also be a nested tuple (for
instance, boost::make_tuple(0, std::make_pair(1, 2), 3) will give (0,
(1, 2), 3) in Python).

The source code is attached to this mail.

The principle is that any sequence previously adapted to Boost.Fusion
will become a tuple in Python. So, by including the right
boost/fusion/adapted/xxx header, one can convert a pair, a tuple, a
boost::array, and obviously any of the sequences provided by
Boost.Fusion. For example:

#include <boost/python.hpp>
#include <boost/fusion/adapted/std_pair.hpp>
#include <boost/fusion/adapted/boost_tuple.hpp>
#include <boost/fusion/container/generation/make_vector.hpp>
#include "make_tuple_from_fusion_sequence.hpp"

using namespace boost::python;

tuple from_sequence()
{
    return make_tuple_from_fusion(
               boost::fusion::make_vector(
                  1,
                  std::make_pair("first", "second"),
                  2,
                  boost::make_tuple('a', 'b', 'c'),
                  3
               )
           );
}

BOOST_PYTHON_MODULE(mymodule)
{
    def("from_sequence", &from_sequence);
}

In Python we get:

>>> import mymodule
>>> mymodule.from_sequence()
(1, ('first', 'second'), 2, ('a', 'b', 'c'), 3)

Is there any interest in adding this function into Boost.Python? If
yes, I can write the doc and tests, clean the source and maybe improve
the implementation (for example, I feel that I could avoid the use of
m_iteration with a better use of Boost.Fusion...).

Regards
Bruno




Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk