2017-01-19 3 views
1

Привет Я использую python для запуска класса cpp, который использует boost python lib для преобразования в используемый python. в то же время у меня есть требование рассортировать классы python, которые используют класс cpp, поддерживающий python.boost python enable_pickling expectation

Так что я сделал это, чтобы добавить enable_picking() к определению класса пример, как это:

class_<pform::base::Price>("Price", init<double>()) 
     .def(self == self) 
     .def(self_ns::str(self_ns::self)) // __str__ 
     .def("get_value", &pform::base::Price::get_value) 

это сделать класс pickleable. Однако я получаю эту ошибку, когда ее разглаживают.

Boost.Python.ArgumentError: Python argument types in 
    Price.__init__(Price) 
did not match C++ signature: 
    __init__(_object*, double) 

Так что же здесь отсутствует?

ответ

0

Немного поздно, но я нашел соответствующую повысить документацию для этого:

http://www.boost.org/doc/libs/1_64_0/libs/python/doc/html/reference/topics/pickle_support.html

рассола Интерфейс

На уровне пользователя, интерфейс Boost.Python рассол включает в себя три специальных метода:

  • __getinitargs__ Когда экземпляр класса расширения Boost.Python маринован, сортировщик проверяет, имеет ли экземпляр метод __getinitargs__ . Этот метод должен возвращать кортеж Python (наиболее удобно использовать boost::python::tuple). Когда экземпляр восстанавливается неуправляемым , содержимое этого кортежа используется в качестве аргументов для конструктора классов. Если __getinitargs__ не определен, pickle.load вызовет конструктор (__init__) без аргументов; то есть объект должен быть конструктивным по умолчанию.

  • __getstate__ Когда экземпляр класса расширения Boost.Python маринован, контролер проверяет, имеет ли экземпляр метод __getstate__. Этот метод должен возвращать объект Python, представляющий состояние экземпляра .

  • __setstate__ Когда экземпляр класса расширения Boost.Python восстанавливается по Unpickler (pickle.load), он сначала строится с помощью результат __getinitargs__ в качестве аргументов (смотри выше). Впоследствии тесты без разборки, если новый экземпляр имеет метод __setstate__. Если так, этот метод вызывается с результатом __getstate__ (объект Python ) в качестве аргумента.

Три специальные методы, описанные выше, могут быть .def() «ред индивидуально пользователем. Однако Boost.Python обеспечивает простой в использовании интерфейс высокого уровня через класс boost::python::pickle_suite, который также обеспечивает согласованность: __getstate__ и __setstate__ должны быть определены как пары. Использование этого интерфейса показано в следующих примерах.

В вашем конкретном примере класс не является конструктивным по умолчанию, так как ему нужен аргумент double (который я предполагаю как «значение»). Для того, чтобы обернуть его для Python вы также должны определить:

.def("__getinitargs__", +[](pform::base::Price const& self){ 
    return boost::python::make_tuple(self.get_value()); 
}) 

Теперь Повысьте Python будет инициализировать класс, используя «значение»; вместо вызова конструктора по умолчанию (pform::base::Price()).

Смежные вопросы