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

时间:2012-03-22 19:04:02

标签: python python-c-api

如何使用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 */
    ...
};

但是,当我测试代码时,应用于bool()对象的Foo始终返回True;永远不会调用_Foo_nonzero函数。

代码有什么问题?

1 个答案:

答案 0 :(得分:2)

C中的类型自定义不是通过方法结构中的特定方法完成的,而是通过填充PyTypeObject结构的特定字段来完成的。在__nonzero__的情况下,C等价物是nb_nonzero结构的PyNumberMethods成员,tp_as_number结构中的PyTypeObject成员指向该成员:http://docs.python.org/c-api/typeobj.html#number-object-structures