Слабые ссылочные объекты

Python поддерживает слабые ссылки как объекты первого класса. Есть два конкретных типа объектов, которые непосредственно реализуют слабые ссылки. Первый - это простой объект-ссылка, а второй действует как прокси для исходного объекта, насколько это возможно.

int PyWeakref_Check(PyObject *ob)

Возвращает ненулевое значение, если ob является либо ссылкой, либо прокси-объектом. Эта функция всегда успешна.

int PyWeakref_CheckRef(PyObject *ob)

Возвращает ненулевое значение, если ob является объектом ссылки. Эта функция всегда успешна.

int PyWeakref_CheckProxy(PyObject *ob)

Возвращает ненулевое значение, если ob является прокси-объектом. Эта функция всегда успешна.

PyObject *PyWeakref_NewRef(PyObject *ob, PyObject *callback)
Возвращаемое значение: Новая ссылка. Часть Стабильный ABI.

Возвращает слабый объект ссылки для объекта ob. Это всегда будет возвращать новую ссылку, но не гарантируется создание нового объекта; может быть возвращен существующий объект ссылки. Второй параметр, callback, может быть вызываемым объектом, который получает уведомление о сборке мусора для ob; он должен принимать единственный параметр, которым будет сам объект слабой ссылки. callback также может быть None или NULL. Если ob не является слабоссылающимся объектом или если callback не является вызываемым, None или NULL, эта функция вернет NULL и вызовет TypeError.

PyObject *PyWeakref_NewProxy(PyObject *ob, PyObject *callback)
Возвращаемое значение: Новая ссылка. Часть Стабильный ABI.

Возвращает слабый ссылочный прокси-объект для объекта ob. Это всегда будет возвращать новую ссылку, но не гарантируется создание нового объекта; может быть возвращен существующий прокси-объект. Второй параметр, callback, может быть вызываемым объектом, который получает уведомление о сборке мусора для ob; он должен принимать единственный параметр, которым будет сам объект слабой ссылки. callback также может быть None или NULL. Если ob не является слабоссылающимся объектом или если callback не является вызываемым, None или NULL, эта функция вернет NULL и вызовет TypeError.

int PyWeakref_GetRef(PyObject *ref, PyObject **pobj)
Часть Стабильный ABI с версии 3.13.

Получить strong reference на ссылаемый объект из слабой ссылки, ref, в *pobj.

  • В случае успеха установите *pobj в новый strong reference на объект по ссылке и верните 1.

  • Если ссылка мертва, установите *pobj в NULL и верните 0.

  • При ошибке вызываем исключение и возвращаем -1.

Added in version 3.13.

PyObject *PyWeakref_GetObject(PyObject *ref)
Возвращаемое значение: Заимствованная ссылка. Часть Стабильный ABI.

Возвращает borrowed reference объекту, на который ссылается слабая ссылка, ref. Если референт больше не жив, возвращается Py_None.

Примечание

Эта функция возвращает borrowed reference объекту, на который ссылается. Это означает, что вы всегда должны вызывать Py_INCREF() для объекта, за исключением случаев, когда он не может быть уничтожен до последнего использования заимствованной ссылки.

Утратил актуальность с версии 3.13, будет удален в версии 3.15: Вместо этого используйте PyWeakref_GetRef().

PyObject *PyWeakref_GET_OBJECT(PyObject *ref)
Возвращаемое значение: Заимствованная ссылка.

Аналогичен PyWeakref_GetObject(), но не проверяет ошибки.

Утратил актуальность с версии 3.13, будет удален в версии 3.15: Вместо этого используйте PyWeakref_GetRef().

void PyObject_ClearWeakRefs(PyObject *object)
Часть Стабильный ABI.

Эта функция вызывается обработчиком tp_dealloc для очистки слабых ссылок.

Перебирает слабые ссылки для объекта и вызывает обратные вызовы для тех ссылок, у которых они есть. Возвращается, когда все вызовы были выполнены.