2017-01-19 100 views
1

嗨,我使用Python啓動其使用boost蟒蛇LIB轉換成可用的蟒蛇一類的cpp。同時,我有一個要求醃製使用python的cpp類的python類。升壓蟒蛇enable_pickling預期

所以我所做的是增加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) 

它使課堂與pickle。但是,如果取消它,我會得到這個錯誤。

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

那麼這裏缺少什麼?

回答

0

有點晚了,但我發現這樣做的相關Boost文檔:

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

泡椒接口

在用戶層面上,Boost.Python的鹹菜 接口涉及三個特殊的方法:

  • __getinitargs__當Boost.Python擴展類的實例進行酸洗,所述的pickler測試如果實例具有__getinitargs__ 方法。該方法必須返回一個Python元組(這是最方便的 使用boost::python::tuple)。當這個實例被 unpickler恢復時,這個元組的內容將被用作類構造函數的參數 。如果__getinitargs__未定義,pickle.load 將調用不帶參數的構造函數(__init__);即對象 必須是默認構造的。

  • __getstate__當一個Boost.Python擴展類的實例被pickle時,pickler會測試這個實例是否有一個__getstate__方法。 此方法應該返回一個代表實例的狀態爲 的Python對象。

  • __setstate__當Boost.Python擴展類的一個實例是由Unpickler會(和pickle.load)恢復,它是使用 的__getinitargs__結果作爲參數(見上文)的第一構造。隨後 unpickler測試新實例是否有__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()); 
}) 

Now Boost Python將使用「value」初始化你的類;而不是調用默認構造函數(pform::base::Price())。