CPython: понимание разницы между tp_dealloc и tp_finalize ⇐ Python

Программы на Python
Anonymous
CPython: понимание разницы между tp_dealloc и tp_finalize

Сообщение Anonymous »

После прочтения документации по tp_dealloc и tp_finalize, а также руководства по финализации и освобождению мне все еще не ясно, что переместить для завершения, а что оставить в Dealloc. PEP говорит о реализации, а не о том, как использовать финализаторы.
Что я понял: фактическое освобождение объекта должно храниться в Dealloc (и, следовательно, Dealloc является обязательным методом), финализатор будет вызываться только один раз, и есть предложение переместить «Любой вызов нетривиального объекта или API» для финализации. Но что здесь нетривиального?
  • тривиален ли вызов функций C (которые не вызывают обратный вызов в Python)?
  • является ли вызов какой-либо функции CPython нетривиальным?
  • и безопасно ли изменять состояние объекта в финализаторе на недопустимое состояние (нарушая любые свойства, которые объект должен поддерживать во время нормальная жизнь), то есть гарантированно ли после финализатора будет следовать Dealloc?
На более практическом уровне, суммируя все вышесказанное: давайте рассмотрим простой тип, имеющий атрибут, который (всегда) указывает на объект Python. При удалении DECREF для этого атрибута следует выполнять в режиме Dealloc или в Finalize?

Подробнее здесь: https://stackoverflow.com/questions/760 ... p-finalize

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