|
Boost Users : |
Subject: [Boost-users] [Boost.Python] Can't work out what an extractor does
From: Kirit Sælensminde (kirit.saelensminde_at_[hidden])
Date: 2008-10-20 23:58:23
I've been puzzling around about how to deal with converting my string
type to/from Python. I've managed to get one part of the puzzle solved,
but can't work out from the documentation what the other part is.
The code I have so far is this:
namespace {
struct to_pystr {
static PyObject *convert( const fostlib::string &s ) {
std::wstring u( fostlib::coerce< std::wstring >( s ) );
return PyUnicode_FromWideChar( u.c_str(), u.length() );
}
static PyTypeObject const* get_pytype() {
return &PyUnicode_Type;
}
};
}
BOOST_PYTHON_MODULE( crypto ) {
using namespace boost::python;
// fostlib::string fostlib::sha1( const fostlib::string& )
def( "sha1", fostlib::sha1 );
implicitly_convertible< fostlib::native_string, fostlib::string >();
to_python_converter< fostlib::string, to_pystr, false >();
}
This works ok if the Python type is str, but it doesn't work for unicode
strings:
Boost.Python.ArgumentError: Python argument types in
crypto.sha1(unicode)
did not match C++ signature:
sha1(fostlib::string)
What I guess I need is some way to wrap the Python call
PyUnicode_FromObject in order to construct my string type, probably from
PyObject, but certainly from unicode. From the documentation at [1] it
isn't at all clear what actually needs to be done -- I can't even tell
from that what the function signature I need to code to is. I think this
[2] is relevant, but can't work out in what way -- no mention is made of
where the reference object comes from and nor is there an example of the
implementation of a simple extractor concept -- the internal
implementations of the ones given on the page are far from illuminating.
[1]http://www.boost.org/doc/libs/1_36_0/libs/python/doc/v2/Extractor.html
[2]http://www.boost.org/doc/libs/1_36_0/libs/python/doc/v2/lvalue_from_pytype.html
It looks like there's some good emails linked from this page [3], but
unfortunately the links to the Python list archives are broken.
[3]http://www.boost.org/doc/libs/1_36_0/libs/python/doc/internals.html
I did think about exposing my string class, but the __unicode__ operator
doesn't seem to be supported. Adding it to the relevant Boost.Python
headers doesn't appear to be enough to get it working and I don't think
that is the right way to do this either.
So, basically, I guess there ought to be a fairly simple way to add this
sort of type conversion into the Boost.Python type registry, but it
appears to be undocumented and I can't see anything for this in the
examples or the tests in the library either.
K
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net