2016-05-11 9 views
2

のPython-3.5.1 \ typeobject.c私の見解でslot_nb_bool(__bool__のスロット機能)はどのように__len__を呼び出すことができますか?オブジェクト

UNSLOT("__bool__", nb_bool, slot_nb_bool, wrap_inquirypred, 
     "self != 0"), 


static int 
slot_nb_bool(PyObject *self) 
{ 
    PyObject *func, *args; 
    int result = -1; 
    int using_len = 0; 
    _Py_IDENTIFIER(__bool__); 

    func = lookup_maybe(self, &PyId___bool__); 
    if (func == NULL) { 
     if (PyErr_Occurred()) 
      return -1; 
     func = lookup_maybe(self, &PyId___len__); 
     if (func == NULL) 
      return PyErr_Occurred() ? -1 : 1; 
     using_len = 1; 
    } 
... 

、スロット関数は次のように__bool__はPythonソースに定義されている場合にのみ使用されている:

def __bool__(self): 
    return True 

func = lookup_maybe(self, &PyId___bool__);場合NULLを返した場合は、__bool__が定義されていないことを示します。スロットはslot_nb_boolで埋められません。 slot_nb_boolは呼び出されません。

slot_nb_bool(__bool__のスロット機能)はどのようにして__len__とコールできますか?

答えて

0

ブールが定義されている場合、lookup_maybe(self, &PyId___bool__);が返され、使用されます。 ブールが定義されていない場合、NULLが返され、lenが代わりに使用されます。

+0

boolが定義されていない場合、nb_boolはNULLにする必要があります。slot_nb_boolは呼び出されません。 – Vince

関連する問題