Python的3.5.1 \对象\ typeobject.c
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;
}
...
在我看来,只有在python源中定义 __ bool __ 时才使用slot函数,如下所示:
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 :(得分:0)
如果定义了 bool ,lookup_maybe(self, &PyId___bool__);
将返回一些内容,并将使用它。如果未定义 bool ,则会返回NULL,并且会尝试使用 len 。