CPython: использование tp_finalize в статических типах, определенных в C, без специального `tp_dealloc`Python

Программы на Python
Anonymous
CPython: использование tp_finalize в статических типах, определенных в C, без специального `tp_dealloc`

Сообщение Anonymous »

PEP 442 представил обратный вызов tp_finalize для определений типов Python (как однозначный эквивалент функции __del__ классов Python) и рекомендует использовать его для любого нетривиального разрушения.< /p>
Официальный документ API гласит:

Если установлен tp_finalize, интерпретатор вызывает его один раз при финализации экземпляр.

Однако это, похоже, не верно для статических типов Python, определенных в C, которые не определяют пользовательский освободитель (ни напрямую, ни унаследовано). со своей базы). Насколько я понимаю:
  • Статические типы без специального tp_dealloc будут наследовать механизм освобождения от базового типа Python (

    Код: Выделить всё

    PyBaseObject_Type
    ), то есть object_dealloc.

    Код: Выделить всё

    object_dealloc
    чрезвычайно прост, он просто вызывает tp_free данного типа объекта.
  • Поэтому tp_finalize никогда не будет вызываться для этих объектов.< /li>
[*]Типы, определенные в куче с помощью PyType_FromSpec и аналогичные, по умолчанию наследуют механизм освобождения subtype_dealloc .
  • Код: Выделить всё

    subtype_dealloc
    намного сложнее и будет вызывать PyObject_CallFinalizerFromDealloc.

< h2>Вопросы
Предполагая, что я правильно понимаю текущее поведение CPython:
  • Ожидается ли, что PyBaseObject_Type< /code> Deallocator не вызывает tp_finalize?
  • Если да, то каковы причины этого исключения?
  • И поможет ли это смысл тогда предоставлять subtype_dealloc как общий обратный вызов Dealloc для статических типов, определенных в C?


Подробнее здесь: https://stackoverflow.com/questions/788 ... tom-tp-dea

Вернуться в «Python»