2012-03-22 6 views
2

__nonzero__はPython C-APIを使用してどのように実装する必要がありますか?__nonzero__はPython C-APIを使用してどのように実装する必要がありますか?

私はいくつかの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()は常にTrueを返すFooオブジェクトに適用されます。 _Foo_nonzero関数は呼び出されません。

コードに問題がありますか?

答えて

2

Cの型のカスタマイズは、メソッド構造体の特定のメソッドではなく、PyTypeObject構造体の特定のフィールドを埋め込むことによって行われます。 http://docs.python.org/c-api/typeobj.html#number-object-structures

__nonzero__の場合には、C当量 PyTypeObject構造体で tp_as_number部材によって指される PyNumberMethods構造体の nb_nonzeroメンバーであります
関連する問題