在 CPython 中设置 nb_bool 是什么?

What sets nb_bool in CPython?

默认情况下,Python 类型对象上的 nb_bool 插槽不应存在。否则,如果默认的slot_nb_bool存在,调用时,定义__len__时会无限递归。

如果是这样,在以下情况下是什么设置了 nb_bool

class A:
  pass
A.__bool__ = lambda x: 0
assert not A()

类型对象没有为 __bool__ 设置描述符,根据 CPython 来源,元类 __setattr__ 似乎没有处理它。

typetp_setattro 插槽 (__setattr__) 确实处理了它。

在 class 上设置属性后,将调用 type_setattro

checks 如果该属性是双下划线方法。如果是,它会更新相应的插槽。