如何使用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
函数。
代码有什么问题?
答案 0 :(得分:2)
C中的类型自定义不是通过方法结构中的特定方法完成的,而是通过填充PyTypeObject
结构的特定字段来完成的。在__nonzero__
的情况下,C等价物是nb_nonzero
结构的PyNumberMethods
成员,tp_as_number
结构中的PyTypeObject
成员指向该成员:http://docs.python.org/c-api/typeobj.html#number-object-structures