2
我爲box2d編寫了一個python包裝器,一切都很完美,但是有時候在調用boost方法python調用方法函數時會出現一個奇怪的TypeError錯誤。這是一種隨機行爲,每次都不會發生。當調用boost方法調用方法函數時發生奇怪的TypeError
問題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)
//...
;
我做出的一個明顯的錯誤?
環境:python 2.6.5,boost 1.49.0,visual studio 2010 – ifocus
我該如何運行你的代碼? – satoru
@ Satoru.Logic對不起,很難粘貼我所有的Python代碼。但是如果你對它有所瞭解,你可以從我的項目中查看v2.2.2分支,它可以很容易地用VS或G ++編譯(需要提升)。這個用法與box2d的C++版本幾乎相同,並且很好用。這個問題不能再出現在上面的代碼中,我不知道如何重新顯示它。 – ifocus