GeneralFailure
GeneralFailure

Reputation: 1105

How to know if object gets deleted in Python

I have an object in the heap and a reference to it. There are certain circumstances in which the object gets deleted but the reference that points to its location doesn't know that. How can I check if there is real data in the heap?

For example:

from PySide import *
a = QProgressBar()
b = QProgressBar()
self.setIndexWidget(index,a)
self.setIndexWidget(index,b)

Then the a object gets deleted but print(a) returns a valid address. However if you try a.value() - runtime error occurs (C++ object already deleted).

a is None returns False.

Upvotes: 6

Views: 8364

Answers (3)

arjenve
arjenve

Reputation: 2333

For the PySide objects you'll need the shiboken module to perform object queries. For Pyside2, you'll need shiboken2.

import shiboken  # shiboken2

print shiboken.isValid(a)

Upvotes: 16

Ashwini Chaudhary
Ashwini Chaudhary

Reputation: 250931

use sip module, read more about sip here

import sip

a = QProgressBar()
sip.isdeleted(a)
False

sip.delete(a)
a
<PyQt4.QtCore.QObject object at 0x017CCA98>

sip.isdeleted(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: underlying C/C++ object has been deleted

Upvotes: 5

madjar
madjar

Reputation: 12951

It is explicitly mentioned in the documentation when an object takes the responsibility for the deletion of another object. In your example, you can see this in the Qt doc :

If index widget A is replaced with index widget B, index widget A will be deleted.

Upvotes: 0

Related Questions