Странная ошибка TypeError произошла при вызове функции метода, предоставляемой форсированным питоном
Я пишу оболочку Python для box2d, все работает отлично, но иногда возникает странная ошибка TypeError при вызове функции метода, предоставляемой Boost Python. Это случайное поведение, которое происходит не каждый раз.
Код проблемы Python:
try:
world = body.GetWorld() # world is b2World instance, body is b2Body instance
world.DestroyBody(body) # raise TypeError: 'NoneType' object is not callable
except TypeError: # catch it, and print some infomation
print "xxxxx", world # I got a b2World instance here
print "xxxxx", sys.getrefcount(world) # I got a value of 66 here
print "xxxxx", world.DestroyBody # I got a bound method object here
raise
Кажется, все в порядке. Как это случилось?
И часть моего кода обертки:
// [file]: https://github.com/layzerar/box2d-py/blob/master/python/world.cpp
// [project]: https://github.com/layzerar/box2d-py
template<class T>
inline void b2Func_ClearUserData(T& self)
{
using namespace boost::python;
xdecref((PyObject*)self.GetUserData());
self.SetUserData(NULL);
}
inline void b2World_DestroyBody(b2World& self, b2Body* body)
{
b2Assert(self.GetBodyCount() > 0);
b2Assert(self.IsLocked() == false);
b2Func_ClearUserData(*body);
self.DestroyBody(body);
}
class_<b2World, b2World_W , boost::noncopyable>("b2World")
//...
.def("CreateBody", b2World_CreateBody, return_internal_reference<>())
.def("DestroyBody", b2World_DestroyBody)
//...
;
Я сделал очевидную ошибку?
1 ответ
После нескольких дней изучения я нашел ответ.
Я ошибаюсь в этом вопросе, исключение действительно не выброшено DestroyBody. Он вызывается виртуальной функцией, которая переписывается в python и вызывается в функции DestroyBody.