简单的例子'map_indexing_suite'的使用是正常的。
class_<map<int, string> >("testMap")
.def(map_indexing_suite<std::map<int, string>, true>())
;
而且在python端也能正常工作。
a = riversim.testMap()
a[1]='sdf'
但是!如果我尝试使用更复杂的对象 BoundaryCondition
而不是 string
在地图中,例如下一个。
enum t_boundary
{
DIRICHLET = 0,
NEUMAN
};
struct BoundaryCondition
{
t_boundary type = DIRICHLET;
double value = 0;
bool operator==(const BoundaryCondition& bc) const;
friend ostream& operator <<(ostream& write, const BoundaryCondition & boundary_condition);
};
typedef map<t_boundary_id, BoundaryCondition> t_BoundaryConditions;
BOOST_PYTHON_MODULE(riversim)
{
enum_<t_boundary>("t_boundary")
.value("DIRICHLET", DIRICHLET)
.value("NEUMAN", NEUMAN)
.export_values()
;
class_<BoundaryCondition>("BoundaryCondition")
.def_readwrite("value", &BoundaryCondition::value)
.def_readwrite("type", &BoundaryCondition::type)
.def(self == self)
;
//and problematic class:
class_<River::t_BoundaryConditions >("t_BoundaryConditions")
.def(map_indexing_suite<t_BoundaryConditions, true>())
;
}
它编译得很好,我可以导入 riversim
:
import riversim
bound = riversim.t_boundary
bc = riversim.BoundaryCondition
bcs = riversim.t_BoundaryConditions
和下一条命令。
bcs[1] = bc
给出错误。
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
in
----> 1 bcs[1] = bc
TypeError: 'Boost.Python.class' object does not support item assignment
如何正确地将map移植到python中?
ps:也可以试试这个解决方案 联系 但它没有工作,得到了和上面一样的错误。
首先。
bcs = riversim.t_BoundaryConditions
分配班级。它需要
bcs = riversim.t_BoundaryConditions()
现在
bcs[1] = bc
结果在
Traceback (most recent call last):
File "./test.py", line 10, in <module>
bcs[1] = bc
TypeError: Invalid assignment
这是因为同样适用于 bc
,都是下面的工作。
bcs[1] = bc()
bcs[2] = riversim.BoundaryCondition()