Что устанавливает nb_bool в CPython?

#cpython #python-internals

#cpython #python-внутренние компоненты

Вопрос:

По умолчанию nb_bool слот для объекта типа Python не должен существовать. В противном случае, если значение по умолчанию slot_nb_bool существует, при вызове оно вызовет бесконечную рекурсию, когда __len__ будет определено.

Если да, то что происходит nb_bool в следующем сценарии?

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

Тип object не имеет дескриптора, установленного для __bool__ , и metaclass __setattr__ , похоже, не обрабатывает его в соответствии с исходным кодом CPython.

Ответ №1:

type ‘s tp_setattro slot ( __setattr__ ) действительно справляется с этим.

После установки атрибута для класса type_setattro вызывается.

Он проверяет, является ли атрибут методом Дандера. Если это так, то он обновляет соответствующий слот.