当我收到此错误消息时,我有点意外。
TypeError: unsupported operand type(s) for <<: 'Packet' and 'int'
我想要做的是通过boost python公开一个类,它重载__lshift__
操作数以获取几种不同的对象类型 - 例如int,float,char *等。我正在暴露类但是当我尝试像packet << 10
这样的事情时,我得到了上述错误。
我理解为什么会这样,但我不确定应该如何解决这个问题。我无法使用boost :: python :: object完全重载,因为它无法区分packet << 10
和packet << 10.5
。
一种可能的解决方案是将函数公开为__lshift__
之外的其他函数。然后我可能会以packet.saveInt(10)
和packet.saveFloat(10.5)
结束,但这会摧毁我们在python中非常敬佩的语法糖。
我的另一个想法是,我可以围绕内置的int类型创建一个非常瘦的类,并将其带入。
struct Int32 {
Int32(bp::object obj) {
if (PyInt_Check(obj.get()) {
value = bp::extract<int>(obj);
}
PyErr_SetObject(PyExc_ValueError, obj);
bp::throw_error_already_set();
}
int value;
}
BOOST_PYTHON_MODULE(intwrapper)
{
bp::class_<Int32>("Int32", bp::init<bp::object>)
.def("value", &Int32::value);
}
有了这个,我可以做以下事情。 packet << Int32(10)
和类似packet << Float(10.5)
。这有点像hackish,我希望有更好的方法。
有什么建议吗?谢谢!
答案 0 :(得分:0)
经过更多调查后我发现问题是我试图通过引用传递一个int而Python不支持。
我尽力保持语法糖,但最终将不同的运算符&lt;&lt;(&lt;()和operator&gt;&gt;()方法暴露为saveInt32(value),saveString(value),loadInt32(), loadString()等等。