o Q$@sdZddlZddlZddlZddlZzeWn ey#ddZYnwejdkr4edZ edZ n edZ ed Z dd d Z Gd d d e Z dS)z-Refactored 'safe reference from dispatcher.pyNcCs t|dS)N__call__)hasattr)objectr2/usr/lib/python3/dist-packages/blinker/_saferef.pycallable.s r)im_selfim_func__self____func__cCs~zt|}Wnty t|rt||YSt|YSw|dur=t|ds5t|ds5Jd|t||d}|SdS)aReturn a *safe* weak reference to a callable target. - ``target``: The object to be weakly referenced, if it's a bound method reference, will create a BoundMethodWeakref, otherwise creates a simple weakref. - ``on_delete``: If provided, will have a hard reference stored to the callable to be called after the safe reference goes out of scope with the reference object, (either a weakref or a BoundMethodWeakref) as argument. Nr r zRsafe_ref target %r has im_self, but no im_func, don't know how to create reference)target on_delete)get_selfAttributeErrorrweakrefrefrBoundMethodWeakref)r rr referencerrrsafe_ref:s    rcsheZdZdZeZdfdd ZdddZddZ e e Z d d Z e Z d d Z d dZddZZS)ra'Safe' and reusable weak references to instance methods. BoundMethodWeakref objects provide a mechanism for referencing a bound method without requiring that the method object itself (which is normally a transient object) is kept alive. Instead, the BoundMethodWeakref object keeps weak references to both the object and the function which together define the instance method. Attributes: - ``key``: The identity key for the reference, calculated by the class's calculate_key method applied to the target instance method. - ``deletion_methods``: Sequence of callable objects taking single argument, a reference to this object which will be called when *either* the target object or target function is garbage collected (i.e. when this object becomes invalid). These are specified as the on_delete parameters of safe_ref calls. - ``weak_self``: Weak reference to the target object. - ``weak_func``: Weak reference to the target function. Class Attributes: - ``_all_instances``: Class attribute pointing to all live BoundMethodWeakref objects indexed by the class's calculate_key(target) method applied to the target objects. This weak value dictionary is used to short-circuit creation so that multiple references to the same (object, function) pair produce the same BoundMethodWeakref instance. Ncsf||}|j|}|dur|j||Stt||}||j|<|j||g|Ri||S)aCreate new instance or return current instance. Basically this method of construction allows us to short-circuit creation of references to already- referenced instance methods. The key corresponding to the target is calculated, and if there is already an existing reference, that is returned, with its deletion_methods attribute updated. Otherwise the new instance is created and registered in the table of already-referenced methods. N) calculate_key_all_instancesgetdeletion_methodsappendsuperr__new____init__)clsr r argumentsnamedkeycurrentbase __class__rrr|s   zBoundMethodWeakref.__new__cCsf|fdd}|g|_|||_t|}t|}t|||_t|||_t ||_ t |j |_ dS)aReturn a weak-reference-like instance for a bound method. - ``target``: The instance-method target for the weak reference, must have im_self and im_func attributes and be reconstructable via the following, which is true of built-in instance methods:: target.im_func.__get__( target.im_self ) - ``on_delete``: Optional callback which will be called when this weak reference ceases to be valid (i.e. either the object or the function is garbage collected). Should take a single argument, which will be passed a pointer to this object. c Ss|jdd}|jdd=z|jj|j=Wn tyYnw|D]4}z t|r,||Wq!tyUztWnt yRt d}t d|||fYnwYq!wdS)z=Set self.isDead to True when method or instance is destroyed.Nz3Exception during saferef %s cleanup function %s: %s) rr%rr!KeyErrorr Exception traceback print_excrsysexc_infoprint)weakselfmethodsfunctionerrrremoves0       z+BoundMethodWeakref.__init__..removeN) rrr!rget_funcrr weak_self weak_funcstr self_name__name__ func_name)r/r rr3r r rrrrs   zBoundMethodWeakref.__init__cCstt|tt|fS)zCalculate the reference key for this reference. Currently this is a two-tuple of the id()'s of the target object and the target function respectively. )idrr4)rr rrrrsz BoundMethodWeakref.calculate_keycCsd|jj|j|jfS)z-Give a friendly representation of the object.z %s(%s.%s))r%r9r8r:r/rrr__str__s zBoundMethodWeakref.__str__cCs |duS)z'Whether we are still a valid reference.Nrr<rrr __nonzero__s zBoundMethodWeakref.__nonzero__cCs*t||jst|jt|St|j|jS)zCompare with another reference.) isinstancer%cmptyper!)r/otherrrr__cmp__s zBoundMethodWeakref.__cmp__cCs.|}|dur|}|dur||SdS)a?Return a strong reference to the bound method. If the target cannot be retrieved, then will return None, otherwise returns a bound instance method for our object and function. Note: You may call this method any number of times, as it does not invalidate the reference. N)r5r6__get__)r/r r1rrrrs   zBoundMethodWeakref.__call__N)r9 __module__ __qualname____doc__rWeakValueDictionaryrrrr classmethodr=__repr__r>rCr __classcell__rrr$rrXs! ,rrE)rHoperatorr+r)rr NameError version_info attrgetterrr4rrrrrrrs""