在 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__
似乎没有处理它。
type
的 tp_setattro
插槽 (__setattr__
) 确实处理了它。
在 class 上设置属性后,将调用 type_setattro
。
它 checks 如果该属性是双下划线方法。如果是,它会更新相应的插槽。
默认情况下,Python 类型对象上的 nb_bool
插槽不应存在。否则,如果默认的slot_nb_bool
存在,调用时,定义__len__
时会无限递归。
如果是这样,在以下情况下是什么设置了 nb_bool
?
class A:
pass
A.__bool__ = lambda x: 0
assert not A()
类型对象没有为 __bool__
设置描述符,根据 CPython 来源,元类 __setattr__
似乎没有处理它。
type
的 tp_setattro
插槽 (__setattr__
) 确实处理了它。
在 class 上设置属性后,将调用 type_setattro
。
它 checks 如果该属性是双下划线方法。如果是,它会更新相应的插槽。