Ральф В. Гросс-Кунстлве приводит следующие примечания:
Используя обычную<class_<>
>обертку:
<class_<std::vector<double>>("std_vector_double")
.def(...)
...
;
>Это может быть перемещено в шаблон так, что несколько типов (<double
>,<int
>,<long
>и т.д.) могут быть обернуты одним и тем же кодом. Этот метод используется в файле<scitbx/include/scitbx/array_family/boost_python/flex_wrapper.h
>в пакете «scitbx». Файл может быть легко изменен для обертывания<std::vector<>
>. Этот тип связывания C++/Python наиболее подходит для контейнеров, которые могут содержать большое количество элементов (>10000).
Использование пользовательских преобразователей значений. Повышаю. Python «конвертеры значений» соответствуют подписям функций, таким как:
<voidfoo(std::vector<double>const&array);
voidfoo(std::vector<double>array);
>Некоторые пользовательские конвертеры значений реализуются в файле<scitbx/include/scitbx/boost_python/container_conversions.h
>Этот код может быть использован для преобразования из типов контейнеров C++, таких как<std::vector<>
>или<std::list<>
>, в наборы Python и наоборот. Несколько простых примеров можно найти в файле<scitbx/array_family/boost_python/regression_test_module.cpp
>Automatic C++ container<->Python tuple conversions наиболее подходят для контейнеров умеренного размера. Эти преобразователи генерируют значительно меньше объектного кода по сравнению с альтернативой 1 выше.
Недостатком использования альтернативы 2 является то, что операторы, такие как арифметика +,-,*,/,%, недоступны. Было бы полезно иметь пользовательские преобразователи rvalue, которые преобразуются в тип «math_array» вместо кортежей. В настоящее время это не реализовано, но возможно в рамках Boost. Python V2 выйдет в ближайшие несколько недель. [ed.: он был опубликован в 2002/03/10 году]
Также было бы полезно иметь «обычные конвертеры lvalue», такие как<std::vector<>
><->список Python. Эти преобразователи будут поддерживать изменение списка Python на C++. Например:
C++:
void foo(std::vector<double> &array)
{
for(std::size_t i=0;i<array.size();i++) {
array[i] *= 2;
}
}
Python:
>>> l = [1, 2, 3]
>>> foo(l)
>>> print l
[2, 4, 6]
Пользовательские преобразователи lvalue требуют внесения изменений в Boost. Базовая библиотека Python в настоящее время недоступна.
P.S.
Файлы «scitbx», упомянутые выше, доступны через анонимные CVS:
cvs -d:pserver:anonymous@cvs.cctbx.sourceforge.net:/cvsroot/cctbx login
cvs -d:pserver:anonymous@cvs.cctbx.sourceforge.net:/cvsroot/cctbx co scitbx