Changeset 2636
- Timestamp:
- 04/09/06 17:59:25 (3 years ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/branches/magic-removal/django/dispatch/dispatcher.py
r2403 r2636 26 26 vs. the original code.) 27 27 """ 28 from __future__ import generators 28 29 import types, weakref 29 30 from django.dispatch import saferef, robustapply, errors 30 31 31 32 __author__ = "Patrick K. O'Brien <pobrien@orbtech.com>" 32 __cvsid__ = "$Id: dispatcher.py,v 1.8 2004/11/26 06:37:33 mcfletch Exp $" 33 __version__ = "$Revision: 1.8 $"[11:-2] 33 __cvsid__ = "$Id: dispatcher.py,v 1.9 2005/09/17 04:55:57 mcfletch Exp $" 34 __version__ = "$Revision: 1.9 $"[11:-2] 35 36 try: 37 True 38 except NameError: 39 True = 1==1 40 False = 1==0 34 41 35 42 class _Parameter: … … 85 92 (more precisely saferef.safeRef() must be able to create 86 93 a reference to the receiver). 87 94 88 95 Receivers are fairly flexible in their specification, 89 96 as the machinery in the robustApply module takes care … … 101 108 102 109 signal -- the signal to which the receiver should respond 103 110 104 111 if Any, receiver will receive any signal from the 105 112 indicated sender (which might also be Any, but is not 106 113 necessarily Any). 107 114 108 115 Otherwise must be a hashable Python object other than 109 116 None (DispatcherError raised on None). 110 117 111 118 sender -- the sender to which the receiver should respond 112 119 113 120 if Any, receiver will receive the indicated signals 114 121 from any sender. 115 122 116 123 if Anonymous, receiver will only receive indicated 117 124 signals from send/sendExact which do not specify a … … 119 126 120 127 Otherwise can be any python object. 121 128 122 129 weak -- whether to use weak references to the receiver 123 130 By default, the module will attempt to use weak … … 150 157 except: 151 158 pass 152 159 153 160 receiverID = id(receiver) 154 161 # get current set, remove any current references to … … 194 201 automatically. It's only necessary to disconnect 195 202 if you want to stop routing to a live object. 196 203 197 204 returns None, may raise DispatcherTypeError or 198 205 DispatcherKeyError … … 299 306 def send(signal=Any, sender=Anonymous, *arguments, **named): 300 307 """Send signal from sender to all connected receivers. 301 308 302 309 signal -- (hashable) signal value, see connect for details 303 310 304 311 sender -- the sender of the signal 305 312 306 313 if Any, only receivers registered for Any will receive 307 314 the message. … … 363 370 responses.append((receiver, response)) 364 371 return responses 365 372 366 373 367 374 def _removeReceiver(receiver): 368 375 """Remove receiver from connections.""" 376 if not sendersBack: 377 # During module cleanup the mapping will be replaced with None 378 return False 369 379 backKey = id(receiver) 370 380 for senderkey in sendersBack.get(backKey,()): … … 389 399 except KeyError: 390 400 pass 391 401 392 402 def _cleanupConnections(senderkey, signal): 393 403 """Delete any empty signals for senderkey. Delete senderkey if empty.""" … … 416 426 except KeyError: 417 427 pass 418 # Senderkey will only be in senders dictionary if sender 428 # Senderkey will only be in senders dictionary if sender 419 429 # could be weakly referenced. 420 try: del senders[senderkey] 421 except: pass 430 try: 431 del senders[senderkey] 432 except: 433 pass 422 434 423 435 … … 467 479 return True 468 480 return False 469 470 481 482 471 483 def _killBackref( receiver, senderkey ): 472 484 """Do the actual removal of back reference from receiver to senderkey""" django/branches/magic-removal/django/dispatch/saferef.py
r1714 r2636 59 59 to the same (object, function) pair produce the 60 60 same BoundMethodWeakref instance. 61 61 62 62 """ 63 63 _allInstances = weakref.WeakValueDictionary() … … 110 110 if callable( function ): 111 111 function( self ) 112 except Exception: 113 traceback.print_exc() 112 except Exception, e: 113 try: 114 traceback.print_exc() 115 except AttributeError, err: 116 print '''Exception during saferef %s cleanup function %s: %s'''%( 117 self, function, e 118 ) 114 119 self.deletionMethods = [onDelete] 115 120 self.key = self.calculateKey( target ) 116 121 self.weakSelf = weakref.ref(target.im_self, remove) 117 122 self.weakFunc = weakref.ref(target.im_func, remove) 123 self.selfName = str(target.im_self) 124 self.funcName = str(target.im_func.__name__) 118 125 def calculateKey( cls, target ): 119 126 """Calculate the reference key for this reference … … 128 135 return """%s( %s.%s )"""%( 129 136 self.__class__.__name__, 130 self. weakSelf(),131 self. weakFunc().__name__,137 self.selfName, 138 self.funcName, 132 139 ) 133 140 __repr__ = __str__
