2012-03-22 65 views
2

如何使用Python C-API实现__nonzero__应如何使用Python C-API实现__nonzero__?

我问的原因是我试图修复一些Python C-API代码中的错误。有一个__nonzero__方法加入到方法表如下:

static PyMethodDef PyFoo_methods[] = { 
    ... 
    { (char*)"__nonzero__", (PyCFunction)_Foo_nonzero, METH_KEYWORDS|METH_VARARGS, NULL }, 
    ... 
}; 

PyTypeObject PyFoo_Type = { 
    PyObject_HEAD_INIT(NULL), 
    0, 
    .... 
    (struct PyMethodDef*)PyFoo_methods, /* tp_methods */ 
    ... 
}; 

然而,当我测试代码,应用于Foo对象总是返回Truebool(); _Foo_nonzero函数永远不会被调用。

代码有什么问题?

回答

2

C中的类型定制不是通过方法struct中的特定方法完成的,而是通过填充PyTypeObject结构的特定字段来完成的。在__nonzero__的情况下,C当量是PyNumberMethods结构的nb_nonzero成员,其由tp_as_number成员在PyTypeObject结构中指向: