/usr/lib/python2.7/dist-packages/weakrefmethod/weakrefmethod.py is in python-weakrefmethod 1.0.3-2ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 43 44 45 46 47 48 49 50 51 | import weakref
__all__ = ['WeakMethod']
class WeakMethod(weakref.ref):
"""
A custom 'weakref.ref' subclass which simulates a weak reference to
a bound method, working around the lifetime problem of bound methods
"""
__slots__ = '_func_ref', '_meth_type', '_alive', '__weakref__'
def __new__(cls, meth, callback=None):
try:
obj = meth.__self__
func = meth.__func__
except AttributeError:
raise TypeError('argument should be a bound method, not {0}'.format(type(meth)))
def _cb(arg):
# The self-weakref trick is needed to avoid creating a reference cycle.
self = self_wr()
if self._alive:
self._alive = False
if callback is not None:
callback(self)
self = weakref.ref.__new__(cls, obj, _cb)
self._func_ref = weakref.ref(func, _cb)
self._meth_type = type(meth)
self._alive = True
self_wr = weakref.ref(self)
return self
def __call__(self):
obj = super(WeakMethod, self).__call__()
func = self._func_ref()
if obj is None or func is None:
return None
return self._meth_type(func, obj)
def __eq__(self, other):
if isinstance(other, WeakMethod):
if not self._alive or not other._alive:
return self is other
return weakref.ref.__eq__(self, other) and self._func_ref == other._func_ref
return False
def __ne__(self, other):
return not self.__eq__(other)
__hash__ = weakref.ref.__hash__
|