slot_nb_bool(__ bool__的槽函数)如何调用__len__?

时间:2016-05-11 06:42:48

标签: python cpython

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__

1 个答案:

答案 0 :(得分:0)

如果定义了 bool lookup_maybe(self, &PyId___bool__);将返回一些内容,并将使用它。如果未定义 bool ,则会返回NULL,并且会尝试使用 len