[C++-sig] boost.python fails to recognize type

Roman Yakovenko roman.yakovenko at gmail.com
Sun Jul 27 20:33:07 CEST 2008


On Sun, Jul 27, 2008 at 4:01 AM, Mateusz Berezecki <mateuszb at gmail.com> wrote:
> Hi list readers,
>
> I want to enable Python to access the C++ class.
> I do this as follows:
>
> BOOST_PYTHON_MODULE(ht)
> {
>  <...>
>  class_<Hypertable::ScanSpec>("ScanSpec")
>    .def_readwrite("row_limit", &Hypertable::ScanSpec::row_limit)
>    .def_readwrite("max_versions", &Hypertable::ScanSpec::max_versions)
>    .def_readwrite("columns", &Hypertable::ScanSpec::columns)
>    .def_readwrite("start_row", &Hypertable::ScanSpec::start_row)
>    .def_readwrite("start_row_inclusive",
> &Hypertable::ScanSpec::start_row_inclusive)
>    .def_readwrite("end_row", &Hypertable::ScanSpec::end_row)
>    .def_readwrite("end_row_inclusive",
> &Hypertable::ScanSpec::end_row_inclusive)
>    ;
>  <...>
> }
>
> The ScanSpec class is defined as follows:
> 00087   class ScanSpec {
> 00088   public:
> 00089     ScanSpec();
> 00090     size_t encoded_length();
> 00091     void encode(uint8_t **bufPtr);
> 00092     bool decode(uint8_t **bufPtr, size_t *remainingPtr);
> 00093     uint32_t row_limit;
> 00094     uint32_t max_versions;
> 00095     std::vector<const char *> columns;
> 00096     const char *start_row;
> 00097     bool start_row_inclusive;
> 00098     const char *end_row;
> 00099     bool end_row_inclusive;
> 00100     std::pair<uint64_t,uint64_t> interval;
> 00101     bool return_deletes;
> 00102   };
>
> The conversion process happens in the Table class wrapper which is
> defined as follows
> class Table {
> private:
>  Hypertable::TablePtr m_table_ptr;
>
> public:
>  Table() {}
>  Table(Hypertable::TablePtr ptr) : m_table_ptr(ptr) {}
>
>  TableScanner create_scanner(object pyspec)
>  {
>    Hypertable::ScanSpec& spec = extract<Hypertable::ScanSpec&>(pyspec);
>    return TableScanner(m_table_ptr->create_scanner(spec, 10));
>  }
> };
>
> The error is as follows
> TypeError: No registered converter was able to extract a C++ reference
> to type Hypertable::ScanSpec from this Python object of type
> Boost.Python.class
>
> I've also tried extracting it as a pointer
> TypeError: No registered converter was able to extract a C++ pointer
> to type Hypertable::ScanSpec from this Python object of type
> Boost.Python.class
>
> And the same happens when trying to extract a copy of ScanSpec, but
> this time the error message tells it's not possible to extract rvalue
> from Boost.Python.class.
>
> I've tried every possible combination and it doesn't work.
>
> Can somebody please help me ?

The first step is to create small and complete example, that shows your problem.


-- 
Roman Yakovenko
C++ Python language binding
http://www.language-binding.net/



More information about the Cplusplus-sig mailing list