2012-12-19 85 views
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) 
    //... 
; 

我做出的一個明顯的錯誤?

+0

環境:python 2.6.5,boost 1.49.0,visual studio 2010 – ifocus

+0

我該如何運行你的代碼? – satoru

+0

@ Satoru.Logic對不起,很難粘貼我所有的Python代碼。但是如果你對它有所瞭解,你可以從我的項目中查看v2.2.2分支,它可以很容易地用VS或G ++編譯(需要提升)。這個用法與box2d的C++版本幾乎相同,並且很好用。這個問題不能再出現在上面的代碼中,我不知道如何重新顯示它。 – ifocus

回答

0

經過幾天的探索,我找到了答案。

我對這個問題犯了一個錯誤,這個異常真的不是由DestroyBody引發的。它是由一個虛擬函數拋出的,它是用python重寫的,並在DestroyBody函數中調用。

相關問題