Copied from Linux Screen Reader project.master
parent
424a9238bb
commit
94c1651586
1 changed files with 86 additions and 0 deletions
@ -0,0 +1,86 @@ |
||||
# -*- python -*- |
||||
# |
||||
# $Id: im_weakref.py,v 1.1 2011-06-08 15:50:07 wirawan Exp $ |
||||
# |
||||
# wpylib.py.im_weakref |
||||
# Created: 20110607 |
||||
# Wirawan Purwanto |
||||
# |
||||
# Advanced hack tools for python: weakref proxy class for instance-method. |
||||
# |
||||
|
||||
""" |
||||
wpylib.py.im_weakref |
||||
|
||||
Complement of weakref's weak reference for an instance method |
||||
(whether bound or unbound). |
||||
|
||||
Original-source: Linux Screen Reader project |
||||
Copied-from: http://mindtrove.info/python-weak-references/ |
||||
Date: 20110607 |
||||
""" |
||||
|
||||
import weakref, new |
||||
|
||||
class im_ref(object): |
||||
''' |
||||
Our own proxy object which enables weak references to bound and unbound |
||||
methods and arbitrary callables. Pulls information about the function, |
||||
class, and instance out of a bound method. Stores a weak reference to the |
||||
instance to support garbage collection. |
||||
|
||||
@organization: IBM Corporation |
||||
@copyright: Copyright (c) 2005, 2006 IBM Corporation |
||||
@license: The BSD License |
||||
''' |
||||
def __init__(self, cb): |
||||
try: |
||||
try: |
||||
self.inst = weakref.ref(cb.im_self) |
||||
except TypeError: |
||||
self.inst = None |
||||
self.func = cb.im_func |
||||
self.klass = cb.im_class |
||||
except AttributeError: |
||||
self.inst = None |
||||
self.func = cb.im_func |
||||
self.klass = None |
||||
|
||||
def __call__(self, *args, **kwargs): |
||||
''' |
||||
Proxy for a call to the weak referenced object. Take arbitrary params to |
||||
pass to the callable. |
||||
|
||||
@raise ReferenceError: When the weak reference refers to a dead object |
||||
''' |
||||
if self.inst is not None and self.inst() is None: |
||||
raise ReferenceError |
||||
elif self.inst is not None: |
||||
# build a new instance method with a strong reference to the instance |
||||
mtd = new.instancemethod(self.func, self.inst(), self.klass) |
||||
else: |
||||
# not a bound method, just return the func |
||||
mtd = self.func |
||||
# invoke the callable and return the result |
||||
return mtd(*args, **kwargs) |
||||
|
||||
def __eq__(self, other): |
||||
''' |
||||
Compare the held function and instance with that held by another proxy. |
||||
|
||||
@param other: Another proxy object |
||||
@type other: L{Proxy} |
||||
@return: Whether this func/inst pair is equal to the one in the other |
||||
proxy object or not |
||||
@rtype: boolean |
||||
''' |
||||
try: |
||||
return self.func == other.func and self.inst() == other.inst() |
||||
except Exception: |
||||
return False |
||||
|
||||
def __ne__(self, other): |
||||
''' |
||||
Inverse of __eq__. |
||||
''' |
||||
return not self.__eq__(other) |
Loading…
Reference in new issue