Python - how to check if weak reference is still available
Asked Answered
C

3

7

I am passing some weakrefs from Python into C++ class, but C++ destructors are actively trying to access the ref when the real object is already dead, obviously it crashes...

Is there any Python C/API approach to find out if Python reference is still alive or any other known workaround for this ?

Thanks

Competent answered 7/6, 2010 at 21:43 Comment(0)
D
3

If you call PyWeakref_GetObject on the weak reference it should return either Py_None or NULL, I forget which. But you should check if it's returning one of those and that will tell you that the referenced object is no longer alive.

Davila answered 7/6, 2010 at 21:48 Comment(0)
S
4

From Python C API documentation:

PyObject* PyWeakref_GetObject(PyObject *ref)
Return value: Borrowed reference.
Return the referenced object from a weak reference, ref. If the referent is no longer live, returns None. New in version 2.2.

Stumpf answered 7/6, 2010 at 21:48 Comment(0)
D
3

If you call PyWeakref_GetObject on the weak reference it should return either Py_None or NULL, I forget which. But you should check if it's returning one of those and that will tell you that the referenced object is no longer alive.

Davila answered 7/6, 2010 at 21:48 Comment(0)
A
1

(Update compared to the older solutions)

We can call the reference and check if it is None:

assert reference_object() is not None, "object is dead"

From weakref docs

Aphoristic answered 7/3 at 17:29 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.