1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
import sys
import weakref
import python_weakref
def check(message, lhs, rhs):
if lhs != rhs:
raise RuntimeError(message, lhs, rhs)
callbacks = []
def callback(ref):
callbacks.append(ref)
ts = python_weakref.TestStruct()
# plain weak reference
ts_ref = weakref.ref(ts)
check("deref'd weakref is not object", ts_ref() is ts, True)
check("wrong number of weak references", weakref.getweakrefcount(ts), 1)
ts_ref().x = 123
# delete the weakref
del ts_ref
check("wrong number of weak references", weakref.getweakrefcount(ts), 0)
# create it again
ts_ref = weakref.ref(ts)
check("wrong number of weak references", weakref.getweakrefcount(ts), 1)
# weak reference proxy with callback
ts_ref_cb = weakref.proxy(ts, callback)
check("wrong number of weak references", weakref.getweakrefcount(ts), 2)
if sys.version_info >= (3,0):
# weakref proxy fails "is" but passes "=="
check("deref'd weakref != object", ts_ref_cb, ts)
check("weakref proxy not usable", ts_ref_cb.x, 123)
# delete object
check("callback was called", callbacks, [])
del ts
check("callback wasn't called", callbacks, [ts_ref_cb])
check("deref'd weakref is not None", ts_ref() is None, True)
|