Документация Python неофициальный перевод

Объекты слабых ссылокWeak Reference Objects

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

int PyWeakref_Check(PyObject *ob)

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

int PyWeakref_CheckRef(PyObject *ob)

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

int PyWeakref_CheckRefExact(PyObject *ob)

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

int PyWeakref_CheckProxy(PyObject *ob)

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

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

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

Изменено в версии 3.16.0a0 (не выпущено): Возбуждает TypeError, если колбэк не является вызываемым, None или NULL.

См. также

PyType_SUPPORTS_WEAKREFS() для проверки, поддерживает ли ob слабые ссылки.

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

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

Изменено в версии 3.16.0a0 (не выпущено): Возбуждает TypeError, если колбэк не является вызываемым, None или NULL.

См. также

PyType_SUPPORTS_WEAKREFS() для проверки, поддерживает ли ob слабые ссылки.

int PyWeakref_GetRef(PyObject *ref, PyObject **pobj)
Часть Stable ABI, начиная с версии 3.13.

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

  • В случае успеха устанавливает *pobj в новую сильную ссылку на целевой объект и возвращает 1.

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

  • В случае ошибки возбуждает исключение и возвращает -1.

Добавлено в версии 3.13.

int PyWeakref_IsDead(PyObject *ref)

Проверяет, является ли слабая ссылка ref мёртвой. Возвращает 1, если ссылка мёртвая, 0 – если живая, и -1 с установленной ошибкой, если ref не является объектом слабой ссылки.

Добавлено в версии 3.14.

void PyObject_ClearWeakRefs(PyObject *object)
Часть Stable ABI.

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

Эта функция перебирает слабые ссылки для object и вызывает колбэки для тех ссылок, у которых они есть. Она завершает работу, когда все колбэки были вызваны.

void PyUnstable_Object_ClearWeakRefsNoCallbacks(PyObject *object)
Это нестабильное API. Оно может меняться без предупреждения в минорных версиях.

Очищает слабые ссылки для object без вызова колбэков.

Эта функция вызывается обработчиком tp_dealloc для типов с финализаторами (т.е. __del__()). Обработчик для этих объектов сначала вызывает PyObject_ClearWeakRefs() для очистки слабых ссылок и вызова их колбэков, затем финализатор и, наконец, эту функцию для очистки любых слабых ссылок, которые могли быть созданы финализатором.

В большинстве случаев вместо этой функции для очистки слабых ссылок лучше использовать PyObject_ClearWeakRefs().

Добавлено в версии 3.13.