Странная ошибка 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.

Другие вопросы по тегам