2016-05-11 8 views
2

Python-3.5.1 \ Objekte \ typeobject.cWie kann slot_nb_bool (Slot-Funktion für __bool__) __len__ aufrufen?

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; 
    } 
... 

In meiner Ansicht ist Schlitzfunktion nur dann verwendet, wenn __bool__ in Python Quelle ist wie folgt definiert:

def __bool__(self): 
    return True 

wenn func = lookup_maybe(self, &PyId___bool__); Rückgabe NULL, es zeigt an, dass __bool__ definiert ist. Der Slot wird dann nicht mit slot_nb_bool gefüllt. slot_nb_bool wird nicht aufgerufen.

Wie kann slot_nb_bool (Steckplatzfunktion für __bool__) __len__ aufrufen?

Antwort

0

Wenn bool definiert ist, wird lookup_maybe(self, &PyId___bool__); etwas zurückgeben, und es wird verwendet. Wenn bool nicht definiert ist, wird NULL zurückgegeben, und es wird versucht, stattdessen len zu verwenden.

+0

Wenn bool nicht definiert ist, sollte nb_bool NULL sein, slot_nb_bool wird nicht aufgerufen. – Vince