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