a 5dg!@sddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl m Z ddl mZmZdadZGdddZGdddZd d Zd d ZGd ddZGdddZGdddejZejd*ddZGdddeZGdddeZGdddejZGdddeZddl m Z Gdd d e j!Z"Gd!d"d"e j!Z#Gd#d$d$ejZ$d%Z%d&e%iZ&d'd(Z'e(d)kre'dS)+N)support) script_helper ALWAYS_EQZfoobarc@seZdZddZdS)CcCsdSNselfrr-/usr/local/lib/python3.9/test/test_weakref.pymethodszC.methodN)__name__ __module__ __qualname__r rrrr rsrc@seZdZdZddZdS)CallableNcCs ||_dSrbar)r xrrr __call__szCallable.__call__)r r rrrrrrr rsrcCs dd}|S)NcSsdSrrrrrr f$zcreate_function..frrrrr create_function#srcCstjSr)rr rrrr create_bound_method'src@sDeZdZddZddZddZddZd d Zd d Zd dZ dS)ObjectcCs ||_dSrarg)r rrrr __init__,szObject.__init__cCs d|jS)Nz rrrrr __repr__.szObject.__repr__cCst|tr|j|jkStSr isinstancerrNotImplementedr otherrrr __eq__0s  z Object.__eq__cCst|tr|j|jkStSrrr!rrr __lt__4s  z Object.__lt__cCs t|jSr)hashrrrrr __hash__8szObject.__hash__cCsdS)Nrrrrr some_method:szObject.some_methodcCsdS)Nrrrrr other_method<szObject.other_methodN) r r rrrr#r$r&r(r*rrrr r+src@seZdZddZdS)RefCyclecCs ||_dSr)cyclerrrr rAszRefCycle.__init__Nr r rrrrrr r+@sr+c@seZdZddZddZdS)TestBasecCs d|_dSNrcbcalledrrrr setUpGszTestBase.setUpcCs|jd7_dSNr0)r refrrr callbackJszTestBase.callbackN)r r rr2r6rrrr r.Esr.-C6?c #sxdfdd}tJtj|d}|zdVWd|nd|0Wdn1sj0YdS)NFcssttqdSr)timesleepgccollectrperiodZ please_stoprr r;Us z"collect_in_thread..collect)targetT)rZ disable_gc threadingThreadstartjoin)r=r;trr<r collect_in_threadNs   rDc@seZdZddZddZejddZddZd d Z d d Z d dZ ddZ ddZ ddZddZddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Zd3d4Zd5d6Zd7d8Z d9d:Z!d;d<Z"d=d>Z#d?d@Z$dAdBZ%dCdDZ&dEdFZ'dGdHZ(dIdJZ)dKdLZ*dMdNZ+dOdPZ,dQdRZ-dSdTZ.dUdVZ/dWdXZ0dYdZZ1d[d\Z2d]d^Z3d_d`Z4dadbZ5dcddZ6dedfZ7dgS)hReferencesTestCasecCsD|t|t|tt}t|}t|~t|dSr)check_basic_refrrrweakrefr5repr)r owrrrr test_basic_reffs    z!ReferencesTestCase.test_basic_refcCs"|t|t|tdSr)check_basic_callbackrrrrrrr test_basic_callbackts  z&ReferencesTestCase.test_basic_callbackcCsRddl}|j}|}t|}|||~||||||dSr/) _testcapicreate_cfunctionrGr5assertIs assertIsNonerFrL)r rNrOrrJrrr test_cfunctionys   z!ReferencesTestCase.test_cfunctioncCsTt}t||j}t||j}~||d||d||jdddS)Nz$expected reference to be invalidatedz-callback not called the right number of times)rrGr5r6rQ assertEqualr1r rIref1ref2rrr test_multiple_callbackss z*ReferencesTestCase.test_multiple_callbackscCs2|fdd}t}t|||_t||}~dS)NcSs |dSrr5)objectr rrr r6szDReferencesTestCase.test_multiple_selfref_callbacks..callback)rrGr5)r r6crVrrr test_multiple_selfref_callbackss  z2ReferencesTestCase.test_multiple_selfref_callbackscCst}|jttj|dddS)N)r6)r assertRaises TypeErrorrGr5)r r[rrr test_constructor_kwargssz*ReferencesTestCase.test_constructor_kwargscCsvt}d|_t||j}t||j}~dd}|t|||t|||tttt||j ddS)Nr4cSs |jdSrr)proxyrrr checksz0ReferencesTestCase.test_proxy_ref..checkrS) rrrGr`r6r]ReferenceErrorboolrTr1)r rIrVrWrarrr test_proxy_refsz!ReferencesTestCase.test_proxy_refcCs6|}t|}||d|}|||ddS)Nz,weak reference to live object should be livez-() should return original object if live)rGr5assertIsNotNonerP)r factoryrIr5o2rrr rFs z"ReferencesTestCase.check_basic_refcCs>d|_|}t||j}~||jdd||ddS)Nrr4z(callback did not properly set 'cbcalled'z3ref2 should be dead after deleting object reference)r1rGr5r6rTrQ)r rfrIr5rrr rLs z'ReferencesTestCase.check_basic_callbackcCst}t|}t|}t|}|||dt}t|}t|}t|}|||d|t|dd~|t|dddS)Nz1reference object w/out callback should be re-usedrSzwrong weak ref count for objectr4z4wrong weak ref count for object after deleting proxy)rrGr5r`rPrTgetweakrefcount)r rIrVr`rWrrr test_ref_reuses*      z!ReferencesTestCase.test_ref_reusecCs6t}t|}t|}t|}|||ddS)Nz4proxy object w/out callback should have been re-used)rrGr`r5rP)r rIproxy1r5proxy2rrr test_proxy_reuses   z#ReferencesTestCase.test_proxy_reusecCsnt}||t|t}t|}||d|d|t |d| |dddg|dd<|t |d|t |d| d|dd|d<||dd||ddt|}t|}|||tt d }t|}||dd|dd||dd|dd||dd|dd||dd|dddS) Nz(proxy for empty UserList should be false r4z+proxy for non-empty UserList should be truerSz,proxy didn't support __contains__() properlyr) ) r check_proxyrGr` collectionsUserList assertFalseappendrTlen assertTrueassertInrange)r rILpZL2p2ZL3Zp3rrr test_basic_proxys0        z#ReferencesTestCase.test_basic_proxycCsFGdddt}|}|dtt||tt|ddS)Nc@seZdZddZddZdS)z0ReferencesTestCase.test_proxy_unicode..CcSsdS)Nstringrrrrr __str__sz8ReferencesTestCase.test_proxy_unicode..C.__str__cSsdS)Nbytesrrrrr __bytes__sz:ReferencesTestCase.test_proxy_unicode..C.__bytes__N)r r rr~rrrrr rsrrr)rZrwdirrGr`rTbytes)r rinstancerrr test_proxy_unicodesz%ReferencesTestCase.test_proxy_unicodecCs4Gddd}|}t|}|t|ddS)Nc@seZdZddZdS)z.ReferencesTestCase.test_proxy_index..CcSsdS)Nrorrrrr __index__sz8ReferencesTestCase.test_proxy_index..C.__index__N)r r rrrrrr r srro)rGr`rToperatorindexr rrIrzrrr test_proxy_index s z#ReferencesTestCase.test_proxy_indexcCsFGddd}|}t|}||dd|d}||ddS)Nc@seZdZddZddZdS)z,ReferencesTestCase.test_proxy_div..CcSsdSN*rr!rrr __floordiv__sz9ReferencesTestCase.test_proxy_div..C.__floordiv__cSsdS)Nrr!rrr __ifloordiv__sz:ReferencesTestCase.test_proxy_div..C.__ifloordiv__N)r r rrrrrrr rsrr)rrrGr`rTrrrr test_proxy_divs  z!ReferencesTestCase.test_proxy_divcCsVGddd}|}t|}||dd|d|d|d}||ddS)Nc@s$eZdZddZddZddZdS)z/ReferencesTestCase.test_proxy_matmul..CcSsdS)Nrr!rrr __matmul__"sz:ReferencesTestCase.test_proxy_matmul..C.__matmul__cSsdS)N]rr!rrr __rmatmul__$sz;ReferencesTestCase.test_proxy_matmul..C.__rmatmul__cSsdS)N1rr!rrr __imatmul__&sz;ReferencesTestCase.test_proxy_matmul..C.__imatmul__N)r r rrrrrrrr r!srr)rrrrrrrr test_proxy_matmul s z$ReferencesTestCase.test_proxy_matmulcCs|tjdSr)check_shared_without_callbackrGr5rrrr test_shared_ref_without_callback7sz3ReferencesTestCase.test_shared_ref_without_callbackcCs|tjdSr)rrGr`rrrr "test_shared_proxy_without_callback:sz5ReferencesTestCase.test_shared_proxy_without_callbackcCstd}||d}||d}|||d~~||}||d}|||d~~||}||}|||d~~||d}||}|||ddS)Nr4z%both callbacks were None in the C APIz&callbacks were NULL, None in the C APIz%both callbacks were NULL in the C APIz&callbacks were None, NULL in the C API)rrP)r makerefrIZp1r{rrr r=s     z0ReferencesTestCase.check_shared_without_callbackcCst}t|}||||t|tjd|d||jdd|dd||jdd| t || t |ddddS) Nzproxy is not of callable typez twinkies!z1call through proxy not passed through to originalzSplat.)rr4rSrn) rrGr`rprPtypeCallableProxyTyperTrr]r^)r rIrVrrr test_callable_proxyOs       z&ReferencesTestCase.test_callable_proxycCsd|_||jddd|_||jdd|`|t|ddd|_||jddd|_||jdd|`|t|dd dS) Nr4z)proxy does not reflect attribute additionrSz-proxy does not reflect attribute modificationfooz(proxy does not reflect attribute removalz4object does not reflect attribute addition via proxyz8object does not reflect attribute modification via proxyz3object does not reflect attribute removal via proxy)rrTrshasattr)r rIr`rrr rpds0      zReferencesTestCase.check_proxycCs6Gddd}|}t|}|d=||jddS)Nc@seZdZdZddZdS)z3ReferencesTestCase.test_proxy_deletion..FooNcSs ||_dSr)result)r accessorrrr __delitem__}sz?ReferencesTestCase.test_proxy_deletion..Foo.__delitem__)r r rrrrrrr Foo{srr)rGr`rTr)r rgrrrr test_proxy_deletionys  z&ReferencesTestCase.test_proxy_deletioncCs4Gdddt}|}|tt|t|dS)Nc@s eZdZdS)z0ReferencesTestCase.test_proxy_bool..ListNr r rrrrr Listrr)listrTrcrGr`)r rZlystrrr test_proxy_boolsz"ReferencesTestCase.test_proxy_boolcs\dGfddd}|t}|td|vWdn1sN0YdS)NcseZdZfddZdS)z1ReferencesTestCase.test_proxy_iter..MyObjcstSr)r robjrr __iter__sz:ReferencesTestCase.test_proxy_iter..MyObj.__iter__N)r r rrrrrr MyObjsrZblech)rGr`r]r^)r rrzrrr test_proxy_iters   z"ReferencesTestCase.test_proxy_itercCs4Gddd}|}|dtt|ddS)Nc@seZdZddZddZdS)z5ReferencesTestCase.test_proxy_reversed..MyObjcSsdS)Nrnrrrrr __len__sz=ReferencesTestCase.test_proxy_reversed..MyObj.__len__cSstdS)Ncba)iterrrrr __reversed__szBReferencesTestCase.test_proxy_reversed..MyObj.__reversed__N)r r rrrrrrr rsrr)rTrBreversedrGr`r rrrrr test_proxy_reversedsz&ReferencesTestCase.test_proxy_reversedcs6dGfddd}|}|tt|dS)NiJxcseZdZfddZdS)z1ReferencesTestCase.test_proxy_hash..MyObjcsSrrrZ cool_hashrr r&sz:ReferencesTestCase.test_proxy_hash..MyObj.__hash__N)r r rr&rrrr rsr)rTr%rGr`rrrr test_proxy_hashsz"ReferencesTestCase.test_proxy_hashcCst}t|}t||j}|t|ddt|}t||j}|t|dd~~~~|t|dd|tddddS)NrSz*got wrong number of weak reference objectsr'rzAweak reference objects not unlinked from referent when discarded.r4z2got wrong number of weak reference objects for int)rrGr5r6rTrhr`)r rIrVrWrjrkrrr test_getweakrefcounts$  z'ReferencesTestCase.test_getweakrefcountcCst}t||j}t||j}~|t||gdt}t||j}t||j}~|t||gd~|t|gd|tdgddS)Nzlist of refs does not matchzlist of refs not clearedr4z#list of refs does not match for int)rrGr5r6rT getweakrefsrUrrr test_getweakrefss*z#ReferencesTestCase.test_getweakrefscCsFGdddt}|d}t|}||dd|d|ddS)Nc@s eZdZdS)z6ReferencesTestCase.test_newstyle_number_ops..FNrrrrr Fsrg@g?g@)floatrGr`rT)r rrrzrrr test_newstyle_number_opss  z+ReferencesTestCase.test_newstyle_number_opscsGdddtifddfdd}z |WnyLYn 0|dz |WnytYn 0|ddS)Nc@s eZdZdS)z?ReferencesTestCase.test_callbacks_protected..BogusErrorNrrrrr BogusErrorsrcs |=dSrrk)datarr removesz;ReferencesTestCase.test_callbacks_protected..removecs dd}dt|<dS)NcSsdS)Nrrrrrr rzRReferencesTestCase.test_callbacks_protected..encapsulate..)rGr5rrrrrr encapsulatesz@ReferencesTestCase.test_callbacks_protected..encapsulatezexception not properly restored) ExceptionZfail)r rrrr test_callbacks_protecteds      z+ReferencesTestCase.test_callbacks_protectedcsnddlGdddt}|}t|fdd}~~|}||_t|jfdd}|}||_~~dS)Nrc@s eZdZdS)z0ReferencesTestCase.test_sf_bug_840829..CNrrrrr r srcsSrr;ignorer:rr rrz7ReferencesTestCase.test_sf_bug_840829..csSrrrrrr rr)r:rZrGr5ic1)r rr[rJrc2rrr test_sf_bug_840829s  z%ReferencesTestCase.test_sf_bug_840829cCsVddl}Gdddt}Gdddt}|}||_t||j|_~~~|dS)Nrc@s eZdZdS)z6ReferencesTestCase.test_callback_in_cycle_1..JNrrrrr J*src@seZdZddZdS)z7ReferencesTestCase.test_callback_in_cycle_1..IIcSs |jdSrrr rrrr acallback.szAReferencesTestCase.test_callback_in_cycle_1..II.acallbackNr r rrrrrr II-srr:rZrrGr5rrJr;r r:rrIrrr test_callback_in_cycle_1'sz+ReferencesTestCase.test_callback_in_cycle_1cCsTddl}Gdddt}Gddd}|}||_t||j|_~~~|dS)Nrc@s eZdZdS)z6ReferencesTestCase.test_callback_in_cycle_2..JNrrrrr r^src@seZdZddZdS)z7ReferencesTestCase.test_callback_in_cycle_2..IIcSs |jdSrrrrrr rbszAReferencesTestCase.test_callback_in_cycle_2..II.acallbackNrrrrr rasrrrrrr test_callback_in_cycle_2Osz+ReferencesTestCase.test_callback_in_cycle_2cCsPddl}Gddd}||}}||_||_t||j|_~~|dS)Nrc@seZdZddZdS)z6ReferencesTestCase.test_callback_in_cycle_3..CcSs|j|j|jdSrmerrJrrrr cbvsz9ReferencesTestCase.test_callback_in_cycle_3..C.cbNr r rrrrrr rusr)r:rrrGr5rrJr;)r r:rrrrrr test_callback_in_cycle_3lsz+ReferencesTestCase.test_callback_in_cycle_3cCsdddl}Gdddt}Gddd}||}}||_||_t||j|_~~~~|dS)Nrc@seZdZddZdS)z6ReferencesTestCase.test_callback_in_cycle_4..CcSs|j|j|jdSrrrrrr rsz9ReferencesTestCase.test_callback_in_cycle_4..C.cbNrrrrr rsrc@s eZdZdS)z6ReferencesTestCase.test_callback_in_cycle_4..DNrrrrr Dsr) r:rZrrrGr5rrJr;)r r:rrrrrrr test_callback_in_cycle_4s z+ReferencesTestCase.test_callback_in_cycle_4csddl}gGfdddt}|d|d}}||_||_t||j|_t||j|_fdd}t||}~~~|g||dg||ddd=||gdS) Nrcs eZdZddZfddZdS)zAReferencesTestCase.test_callback_in_cycle_resurrection..CcSs ||_dSr)Z attribute)r valuerrr rszJReferencesTestCase.test_callback_in_cycle_resurrection..C.__init__cs|jdSr)rtr[rZalistrr rszKReferencesTestCase.test_callback_in_cycle_resurrection..C.acallbackN)r r rrrrrrr rsrr4rScsddS)N C went awayrtrrrr C_went_awayszKReferencesTestCase.test_callback_in_cycle_resurrection..C_went_awayr) r:rZr[rGr5rrJrTr;)r r:rrrrrJrrr #test_callback_in_cycle_resurrections$     z6ReferencesTestCase.test_callback_in_cycle_resurrectioncsddl}gfdd}Gfdddt}||}}||_||_|j}t|||_t||j|_t||}|||~~~~|g| |dg||ddd=| |gdS)NrcsddS)Nsafe_callback calledrrrrr safe_callbackszDReferencesTestCase.test_callbacks_on_callback..safe_callbackcseZdZfddZdS)z8ReferencesTestCase.test_callbacks_on_callback..CcsddS)Nz cb calledrrrrr rsz;ReferencesTestCase.test_callbacks_on_callback..C.cbNrrrrr rsrr) r:rZr"rrGr5rJrPrTr;)r r:rrr[dr6Z external_wrrrr test_callbacks_on_callbacks(     z-ReferencesTestCase.test_callbacks_on_callbackcCs|tjdSr)check_gc_during_creationrGr5rrrr test_gc_during_ref_creationsz.ReferencesTestCase.test_gc_during_ref_creationcCs|tjdSr)rrGr`rrrr test_gc_during_proxy_creationsz0ReferencesTestCase.test_gc_during_proxy_creationcCst}tdddtGddd}dd}|}|}||_|||_z |}t||Wtj|n tj|0dS)Nr4c@s eZdZdS)z6ReferencesTestCase.check_gc_during_creation..ANrrrrr AsrcWsdSrr)argsrrr r6sz=ReferencesTestCase.check_gc_during_creation..callback)r: get_threshold set_thresholdr;arJrGr5)r rZ thresholdsrr6Z referencedrrrr rs z+ReferencesTestCase.check_gc_during_creationcCsGdddt}|}dS)Nc@seZdZddZdS)z>ReferencesTestCase.test_ref_created_during_del..TargetcSst|adSr)rGr5 ref_from_delrrrr __del__szFReferencesTestCase.test_ref_created_during_del..Target.__del__Nr r rrrrrr Targetsr)rZ)r rwrrr test_ref_created_during_delsz.ReferencesTestCase.test_ref_created_during_delc Cs.tt}|t|jdddddtdSr/)rGr5rr]r^rr:r;)r rrrr test_inits zReferencesTestCase.test_initcCsXGdddt}g}ttt||j}d}t||d|||gdS)Nc@s eZdZdS)z*ReferencesTestCase.test_classes..ANrrrrr r)sr)rZrGr5intrtr:r;rT)r rlrrrr test_classes's zReferencesTestCase.test_classesc Cs\td}td}td}t|}t|}t|}t|}|||k|||k|||k|||k|||k|||k|||k|||k||tk||tk~~~t|||fD]}||dq|||k|||k|||k|||k| ||k||u| ||k||udS)Nr4rS) rrGr5rvrsrr:r;rPrT) r ryzrbr[rrrrr test_equality3s6    z ReferencesTestCase.test_equalitycCs|tjtjtjtjg}td}td}t|}t|}|D]}|t |||q<~~t |D]}|t |||qbdSr3) rltgtlegerrGr5r]r^r:r;)r opsrrrroprrr test_orderingXs  z ReferencesTestCase.test_orderingcCsjtd}td}t|}t|}|t|td~~t|t|td|tt|dSr) rrGr5rTr%r:r;r]r^)r rrrrrrr test_hashinggs  zReferencesTestCase.test_hashingcCsNGddd}t}|d}}tdD]}||||<}q*~tdS)Nc@seZdZddZdS)z1ReferencesTestCase.test_trashcan_16602..Ccs0|sdSt|fdd}t|||_dS)Ncs }dSrr)wparentrIZwselfrr rszFReferencesTestCase.test_trashcan_16602..C.__init__..cb)rGr5r )r parentrrrr r|s   z:ReferencesTestCase.test_trashcan_16602..C.__init__Nr-rrrr r{srd)rGWeakKeyDictionaryrxr:r;)r rrrootr[nrrr test_trashcan_16602vs   z&ReferencesTestCase.test_trashcan_16602cCsDtd}dd}t||}||j|t|}||jdS)Nr4cSsdSrrrYrrr rrz.)rrGr5rP __callback__rQ)r rr6rVrWrrr test_callback_attributes   z*ReferencesTestCase.test_callback_attributecCs<td}t||j}||j~t||jdSr3) rrGr5r6rerr gc_collectrQ)r rr5rrr &test_callback_attribute_after_deletions  z9ReferencesTestCase.test_callback_attribute_after_deletioncCsTtd}dd}t||}|tdd|_Wdn1sF0YdS)Nr4cSsdSrrrYrrr rrz@ReferencesTestCase.test_set_callback_attribute..cSsdSrrrYrrr rr)rrGr5r]AttributeErrorr)r rr6rVrrr test_set_callback_attributes   z.ReferencesTestCase.test_set_callback_attributecCs6Gdddt}|d}t|dd}~tdS)Nc@seZdZddZdS)z;ReferencesTestCase.test_callback_gcs..ObjectWithDelcSsdSrrrrrr rrzCReferencesTestCase.test_callback_gcs..ObjectWithDel.__del__Nrrrrr ObjectWithDelsrr4cSstSr)rrrYrrr rrz6ReferencesTestCase.test_callback_gcs..)rrGr5rr)r rrrVrrr test_callback_gcss z$ReferencesTestCase.test_callback_gcsN)8r r rrKrMr cpython_onlyrRrXr\r_rdrFrLrirlr|rrrrrrrrrprrrrrrrrrrrrrrrrrrrrrrrr r rrrrrrrrr rEdsh         ((.&  % rEc@s4eZdZddZddZddZddZd d Zd S) SubclassableWeakrefTestCasecCslGdddtj}td}||dd}|||||j||jd~||||jdS)Ncs*eZdZdfdd ZfddZZS)z=SubclassableWeakrefTestCase.test_subclass_refs..MyRefNrcs||_t||dSr)rsuperr)r obr6r __class__rr rszFSubclassableWeakrefTestCase.test_subclass_refs..MyRef.__init__csd|_tSNT)calledrrrr!rr rszFSubclassableWeakrefTestCase.test_subclass_refs..MyRef.__call__)Nr)r r rrr __classcell__rrr!r MyRefsr&rr) rGr5rrPrvr$rTrrQ)r r&rImrrrr test_subclass_refss   z.SubclassableWeakrefTestCase.test_subclass_refscCsGdddtj}td}||}t|}||||t|||g|t|d||}|t|dt|}|t|d|||d| ||dd| ||dddS)Nc@s eZdZdS)zXSubclassableWeakrefTestCase.test_subclass_refs_dont_replace_standard_refs..MyRefNrrrrr r&sr&rrSrnrr4) rGr5r assertIsNotrTrrhrurPrw)r r&rIr1r2Zr3refsrrr -test_subclass_refs_dont_replace_standard_refss   zISubclassableWeakrefTestCase.test_subclass_refs_dont_replace_standard_refscCs`Gdddtj}td}||t}||t}|||t|}||||||dS)Nc@s eZdZdS)zUSubclassableWeakrefTestCase.test_subclass_refs_dont_conflate_callbacks..MyRefNrrrrr r&sr&r)rGr5ridstrr+rrw)r r&rIr,r-r.rrr *test_subclass_refs_dont_conflate_callbackss     zFSubclassableWeakrefTestCase.test_subclass_refs_dont_conflate_callbackscCshGdddtj}td}||ddd}||jd||jd||d|t|ddS)Nc@s(eZdZdZddZddZddZdS) zHSubclassableWeakrefTestCase.test_subclass_refs_with_slots..MyRefslot1slot2cSstj|||Sr)rGr5__new__)rr r6r4r5rrr r6szPSubclassableWeakrefTestCase.test_subclass_refs_with_slots..MyRef.__new__cSs||_||_dSrr3)r r r6r4r5rrr rszQSubclassableWeakrefTestCase.test_subclass_refs_with_slots..MyRef.__init__cSs |j|jSrr3rrrr methszMSubclassableWeakrefTestCase.test_subclass_refs_with_slots..MyRef.methN)r r r __slots__r6rr7rrrr r&sr&rabcdefZabcdef__dict__) rGr5rrTr4r5r7rsr)r r&rIrrrr test_subclass_refs_with_slotss z9SubclassableWeakrefTestCase.test_subclass_refs_with_slotscsGdddtj}fdd}t}|||}||_~~jdt}|||}|||}||_||_~~~jddS)Nc@s eZdZdS)zHSubclassableWeakrefTestCase.test_subclass_refs_with_cycle..MyRefNrrrrr r&sr&csjd7_dSr3r0)rrrr r6szKSubclassableWeakrefTestCase.test_subclass_refs_with_cycle..callbackr)rGr5rrIrTr1r)r r&r6rIr,r-rrr test_subclass_refs_with_cycles"    z9SubclassableWeakrefTestCase.test_subclass_refs_with_cycleN)r r rr*r/r2r<r=rrrr rs  rc@sZeZdZddZddZddZddZd d Zd d Ze j d dZ ddZ ddZ dS)WeakMethodTestCasecCsGdddt}|S)Nc@seZdZddZdS)z'WeakMethodTestCase._subclass..CcSsdS)Nrrrrr r(sz3WeakMethodTestCase._subclass..C.some_methodN)r r rr(rrrr rsr)r)r rrrr _subclassszWeakMethodTestCase._subclasscCsntd}t|j}||tj||t|j||j|||j |jj | |ddS)Nr4r') rrG WeakMethodr(ZassertIsInstance ReferenceTyperrP__self____func__rTr rIrrrr test_alives zWeakMethodTestCase.test_alivecCs0td}t|j}~t||ddSr3)rrGrAr(r:r;rPrErrr test_object_dead%s  z#WeakMethodTestCase.test_object_deadcCs:|}|d}t|j}|`t||ddSr3)r@rGrAr(r:r;rP)r rrIrrrr test_method_dead,s  z#WeakMethodTestCase.test_method_deadcsh|}gfdd}|d}t|j|}~t||gtj|_t||gdS)Ncs|dSrrrZcallsrr r8sz=WeakMethodTestCase.test_callback_when_object_dead..cbr4)r@rGrAr(r:r;rTrr rrrIrrrIr test_callback_when_object_dead4s z1WeakMethodTestCase.test_callback_when_object_deadcsd|}gfdd}|d}t|j|}|`t||g~t||gdS)Ncs|dSrrrrIrr rHsz=WeakMethodTestCase.test_callback_when_method_dead..cbr4)r@rGrAr(r:r;rTrJrrIr test_callback_when_method_deadDs z1WeakMethodTestCase.test_callback_when_method_deadcCs<td}dd}t|j|}t|}~||ddS)Nr4cSsdSrr)_rrr rXsz-WeakMethodTestCase.test_no_cycles..cb)rrGrAr(r5rP)r rIrrrJrrr test_no_cyclesTs  z!WeakMethodTestCase.test_no_cyclescsTfdd}fdd}td}td}t|j}t|j}t|j}t|j}||||||||||||||||||td} t| j} t| j} ||| ||| ||| ||| |||j||t~~~ t||||| | f} | D]:} | D].}| |k| |u| |k| |uqqdS)Ncs ||k||kdSrrvrsrrrrr _eq`sz-WeakMethodTestCase.test_equality.._eqcs ||k||kdSrrOrPrrr _necsz-WeakMethodTestCase.test_equality.._ner4rS) rrGrAr(r*rr:r;rT)r rQrRrrrrr[rrerr.qrrrr r_s<                    z WeakMethodTestCase.test_equalitycCstd}td}t|j}t|j}t|j}|t|t|t|}~~t|t|||t||| t t|dSr3) rrGrAr(r*rTr%r:r;r]r^)r rrrrr[Zharrr r s   zWeakMethodTestCase.test_hashingN)r r rr@rFrGrHrKrLrrrNrr rrrr r>s  )r>c@seZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ ddZ ddZddZddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-Zd.d/Zd0d1Zd2d3Zd4d5Zd6d7Zd8d9Zd:d;Z dd?Z"d@dAZ#dBdCZ$dDdEZ%dFdGZ&dHdIZ'dJdKZ(dLdMZ)dNdOZ*dPdQZ+dRdSZ,dTdUZ-dVdWZ.dXdYZ/dZd[Z0d\d]Z1d^d_Z2d`daZ3e4j5dbdcZ6ddS)eMappingTestCaseroc sd}ddt|D}|fdd|D}|}z t|WntyRYn0~tt|}~tt|}||d||ddS)NcSsg|] }tqSrr+.0rrrr rz4MappingTestCase.check_len_cycles..c3s|]}|VqdSrrrYrIconsrr rz3MappingTestCase.check_len_cycles..)rr4r) rxitemsnext StopIterationr:r;rurwrT) r dict_typer]Nr_dctitn1n2rr\r check_len_cycless    z MappingTestCase.check_len_cyclescCs|tjdddS)NcSs|dfSr3rrrrr rrz.)rhrGrrrrr test_weak_keyed_len_cyclessz*MappingTestCase.test_weak_keyed_len_cyclescCs|tjdddS)NcSsd|fSr3rrrrr rrz=MappingTestCase.test_weak_valued_len_cycles..)rhrGWeakValueDictionaryrrrr test_weak_valued_len_cyclessz+MappingTestCase.test_weak_valued_len_cyclesc s|jtjgtRtddD]}d}tdt|||ddt|D}|fdd|D}~|}z t|WntyYn0t |}~t |} | |d| ||| | d| | |q"dS) Nr4rrVrcSsg|] }tqSrrWrXrrr rZrz2MappingTestCase.check_len_race..c3s|]}|VqdSrrr[r\rr r^rz1MappingTestCase.check_len_race..) Z addCleanupr:rrrxr;r_r`raruZassertGreaterEqualZassertLessEqual) r rbr]thrcr_rdrerfrgrr\r check_len_races(      zMappingTestCase.check_len_racecCs|tjdddS)NcSs|dfSr3rrrrr rrz:MappingTestCase.test_weak_keyed_len_race..)rmrGrrrrr test_weak_keyed_len_racesz(MappingTestCase.test_weak_keyed_len_racecCs|tjdddS)NcSsd|fSr3rrrrr rrz;MappingTestCase.test_weak_valued_len_race..)rmrGrjrrrr test_weak_valued_len_racesz)MappingTestCase.test_weak_valued_len_racecCs|\}}|D]*}|t|d||||jdqt|}t|}| | |||d~~|t ||j |d=|t ||j dd~~|t |ddt }| t|jdt|d<| t|jddS)Nr4#wrong object returned by weak dict!z/cloning of weak-valued dictionary did not work!r/deleting object did not cause dictionary updatez0deleting the values did not clear the dictionaryrS)make_weak_valued_dictrTrGrhrPrrr_copysortruCOUNTrjr]KeyError __getitem__rr dictobjectsrIZitems1Zitems2rrr test_weak_valuess6    z MappingTestCase.test_weak_valuescCs|\}}|D]0}|t|dd|||j||dq|}|}|t|t|d~~|t ||j |d=|t ||j dd~~|t |ddt d}d ||<| ||| d |dS) Nr4z&wrong number of weak references to %r!rpz.cloning of weak-keyed dictionary did not work!rrqz.deleting the keys did not clear the dictionaryrz$What is the meaning of the universe?")make_weak_keyed_dictrTrGrhrPrr_rssetrururrw assertNotInrxrrr test_weak_keyss6    zMappingTestCase.test_weak_keyscCs|\}}|||}|t|t|t|}|D]>}|}||||||||j||||q>|t|dt|}|tt|t||D]>}|}||||||||j||||q|t|ddSr/) r} check_iterskeyrefsrTrurrwrrr ryrzr.Zobjects2rJr rrr test_weak_keyed_iterss*         z%MappingTestCase.test_weak_keyed_iterscCs |\}}|||}|t|t|t|}|D]<}|}||||j||j||jj||q>|t|dt|}|tt|t||D]<}|}||||j||j||jj||q|t|ddSr/) rrr valuerefsrTrurrr itervaluerefsrrrr test_weak_valued_iters,s&     z&MappingTestCase.test_weak_valued_iterscCst|}|D]}||q||dt|}|D]}||q@||dt|}|D]}||qp||dt|}|D]}||q||ddS)Nzitems() did not touch all itemsz!__iter__() did not touch all keysz!iterkeys() did not touch all keysz%itervalues() did not touch all values)rr_rrskeysvalues)r ryr_itemrrrvrrr rEs$              zMappingTestCase.check_iterscCslt|}tt||}t||d=t|tt|t|t|dg~|t||ddS)Nr4) rurgetattrr`r:r;rwrrT)r ryrzZ iter_namerrerrr "check_weak_destroy_while_iterating_s$z2MappingTestCase.check_weak_destroy_while_iteratingcCs| \}}|||Wdn1s,0Y|$\}}|t|j|Wdn1sf0Y||||$\}}|t|j|Wdn1s0Y||||\}}|||<Wdn1s0Y||||t|}|\}}||Wdn1s:0Y||||\}}|Wdn1sz0Y|t |ddSr/) rr]rvrpoprTrsupdateclearru)r ry testcontextrrZddictrrr -check_weak_destroy_and_mutate_while_iteratingls$ * .  .  &  *  (z=MappingTestCase.check_weak_destroy_and_mutate_while_iteratingcCstd}|Vt|}|t||t||d|||<|t||Wdn1sj0Y|@|t||d||t||dWdn1s0Y|F|t||d|t|=|t||dWdn1s0Y|@|t||d||t||dWdn1sv0Y|(||t|dWdn1s0Y|t|ddS) Ni@r4rSrnr'r)r?r)rrurr`rrTpopitemr)r ryrrIrrrr &check_weak_del_and_len_while_iteratings..2440z6MappingTestCase.check_weak_del_and_len_while_iteratingcs|\|d|d|d|d|\tjfdd}|||\||dS)Nrr_rrc3sXzDt}t|j}tt||fVWd}tnd}t0dSrrr_r`rrr:r;r)rerryrzrr rs   zKMappingTestCase.test_weak_keys_destroy_while_iterating..testcontext)r}r contextlibcontextmanagerrrr rrrr &test_weak_keys_destroy_while_iteratings    z6MappingTestCase.test_weak_keys_destroy_while_iteratingcs|\|d|d|d|d|d|\tjfdd}|||\||dS)Nrr_rrrc3sXzDt}t|j}t|t|fVWd}tnd}t0dSrr)rerrrr rs   zMMappingTestCase.test_weak_values_destroy_while_iterating..testcontext)rrrrrrrrrrr (test_weak_values_destroy_while_iteratings    z8MappingTestCase.test_weak_values_destroy_while_iteratingcCs*td}t|di}|||ddSNrnilrrGrrTr rIryrrr #test_make_weak_keyed_dict_from_dictsz3MappingTestCase.test_make_weak_keyed_dict_from_dictcCs4td}t|di}t|}|||ddSrrr rIryZdict2rrr .test_make_weak_keyed_dict_from_weak_keyed_dicts z>MappingTestCase.test_make_weak_keyed_dict_from_weak_keyed_dictcCs8t}tttt|j}|D]}|j||<q ||fSr)rGrrmaprrxrurr ryrzrIrrr r}s  z$MappingTestCase.make_weak_keyed_dictcCs*td}td|i}||d|dSrrrGrjrTrrrr $test_make_weak_valued_dict_from_dictsz4MappingTestCase.test_make_weak_valued_dict_from_dictcCs4td}td|i}t|}||d|dSrrrrrr 0test_make_weak_valued_dict_from_weak_valued_dicts z@MappingTestCase.test_make_weak_valued_dict_from_weak_valued_dictcCs|ttjj|ttjii|ttjddtd}dD]>}tjfi||i}|t||g||||q@dS)Nrrnr ryr"iterable) r]r^rGrjrrrTrr)r rIkwrrrr test_make_weak_valued_dict_miscsz/MappingTestCase.test_make_weak_valued_dict_misccCs8t}tttt|j}|D]}|||j<q ||fSr)rGrjrrrrxrurrrrr rrs  z%MappingTestCase.make_weak_valued_dictc Cs|}|||<|||<|t|d|\}}|t|d||urX|||n ||||\}}|t|d||ur|||n |||dS)NrSr4r)rTrurrP) r klasskey1value1key2value2weakdictrrrrr check_popitem s   zMappingTestCase.check_popitemcCs|tjdtdtdS)Nrr)rrGrjrrrrr test_weak_valued_dict_popitems z-MappingTestCase.test_weak_valued_dict_popitemcCs|tjtdtddSNzvalue 1zvalue 2)rrGrrrrrr test_weak_keyed_dict_popitems z,MappingTestCase.test_weak_keyed_dict_popitemcCs|||d|}|||}|||||||||||||||||}||||||||||||||dS)Nz9invalid test -- value parameters must be distinct objects)r+ setdefaultrPrwget)r rkeyrrrrIrrr check_setdefault#s      z MappingTestCase.check_setdefaultcCs|tjdttdS)Nr)rrGrjrrrrr test_weak_valued_dict_setdefault4s z0MappingTestCase.test_weak_valued_dict_setdefaultcCs|tjtdddSr)rrGrrrrrr test_weak_keyed_dict_setdefault8sz/MappingTestCase.test_weak_keyed_dict_setdefaultcCs|}|||t|t||D]>}|||d||}||||||||q,|D]<}|||d||}||||||||qtdS)Nz(mysterious new key appeared in weak dictz%original key disappeared in weak dict)rrTrurrwrrP)r rryrrrrrr check_update<s    zMappingTestCase.check_updatec Cs|tjdtdttti|ttjjt}|t|jii|t|jdd|t| gt d}dD]F}t}|jfi||i|t| |g||||q~dS)Nr4rrrnr) rrGrjrr]r^rrTrrr)r rrIrrrr test_weak_valued_dict_updateOsz,MappingTestCase.test_weak_valued_dict_updatec Cst}t}t}td|i}t||d}|}||d}d|fd|fg}||B} |t| t|t|B|t| tj||O}||| ||B} |t| t||B|t| tj||O}||| |} | |O} |t| t|t|B|t| tj||B} |t| |t|B|t| tj~|d| |d| |d| |d| dS)Nr4r4rS)r4rnr)r?rS) rrGrjrsrTryrPrr) r rrr[Zwvd1Zwvd2Zwvd3d1pairstmp1tmp2tmp3tmp4rrr test_weak_valued_union_operators`s<      z0MappingTestCase.test_weak_valued_union_operatorsc Cs$|tjtdtdtdidS)Nr4rSrn)rrGrrrrrr test_weak_keyed_dict_updatesz+MappingTestCase.test_weak_keyed_dict_updatecCsht}td}td}d||<d||<|t|d||=|t|d|t||gdS)N12 somethingrSr4)rGrrrTrurrr ro1rgrrr test_weak_keyed_delitemsz'MappingTestCase.test_weak_keyed_delitemc Cst}t}t}t|d|di}t|d|di}|}|d|di}|df|dfg}||B} |t| t|t|B|t| tj||O}||| ||B} |t| t||B|t| tj||O}||| |} | |O} |t| t|t|B|t| tj||B} |t| |t|B|t| tj~|d| |d| |d| |d| dS) Nr4rSrnr'56) rrGrrsrTryrPrrr) r rrgZo3Zwkd1Zwkd2Zwkd3rrrrrrrrr test_weak_keyed_union_operatorss<   z/MappingTestCase.test_weak_keyed_union_operatorscCslt}td}td}||d<||d<|t|d|d=|t|d|t|d|fgdS)Nrrrzsomething elserSr4)rGrjrrTrurr_rrrr test_weak_valued_delitemsz(MappingTestCase.test_weak_valued_delitemcCsft}td}|t|j||t|j||t|jd|t|jd|t|jdddS)Nr ) rGrrr]rvrrwr^ __setitem__)r rrIrrr test_weak_keyed_bad_delitemsz+MappingTestCase.test_weak_keyed_bad_delitemcst}dGfdddtfddtdDD]}|j||<q<~t|dd}D]}|d 7}||=qn|t |d||d dS) NFcs*eZdZddZddZfddZdS)z.CcSs ||_dSrr()r rrrr rszEMappingTestCase.test_weak_keyed_cascading_deletes..C.__init__cSs t|jSr)r%rrrrr r&szEMappingTestCase.test_weak_keyed_cascading_deletes..C.__hash__csr d=|j|jkS)Nrr(r!mutateobjsrr r#szCMappingTestCase.test_weak_keyed_cascading_deletes..C.__eq__N)r r rrr&r#rrrr rsrcsg|] }|qSrrrX)rrr rZrzEMappingTestCase.test_weak_keyed_cascading_deletes..r'Trr4rS) rGrrZrxrrrreverserTru)r rrIcountr)rrrr !test_weak_keyed_cascading_deletess     z1MappingTestCase.test_weak_keyed_cascading_deletescCst}|t|ddS)Nz)rGrj assertRegexrHr ryrrr test_make_weak_valued_dict_reprsz/MappingTestCase.test_make_weak_valued_dict_reprcCst}|t|ddS)Nz)rGrrrHrrrr test_make_weak_keyed_dict_reprsz.MappingTestCase.test_make_weak_keyed_dict_reprcCs\t}t:tdD] }|dt}||d~qWdn1sN0YdSNiro)rGrjrDrxrr+r+r rrrrrr $test_threaded_weak_valued_setdefaults   z4MappingTestCase.test_threaded_weak_valued_setdefaultcCsbt}t@tdD]&}t|d<|dd}||dqWdn1sT0YdSr)rGrjrDrxr+rr+rrrr test_threaded_weak_valued_pops    z-MappingTestCase.test_threaded_weak_valued_popcCsbt}t@tdD]&}t}||d<|t|dd}qWdn1sT0YdS)Ni@ ror4)rGrjrDrxr+rTru)r rrrIrrr %test_threaded_weak_valued_consistencys z5MappingTestCase.test_threaded_weak_valued_consistencycsg}Gddd}Gddd}fdd}dd}||tjtjf|}g} g} td D]6} || || } } | | | | | || <~ ~ q^tj|||fd }|tjurtj|| fd }ntj|| fd }||| | |r|d dS) Nc@seZdZddZdS)z?MappingTestCase.check_threaded_weak_dict_copy..DummyKeycSs ||_dSrctrr rrrr r)szHMappingTestCase.check_threaded_weak_dict_copy..DummyKey.__init__Nr-rrrr DummyKey(src@seZdZddZdS)zAMappingTestCase.check_threaded_weak_dict_copy..DummyValuecSs ||_dSrrrrrr r-szJMappingTestCase.check_threaded_weak_dict_copy..DummyValue.__init__Nr-rrrr DummyValue,src sTz durt|}n|}Wn.tyN}z||WYd}~n d}~00dSr#)rsdeepcopyrrt)rexcrMexrrr dict_copy0s   z@MappingTestCase.check_threaded_weak_dict_copy..dict_copycSsHd}|rDtdt|d}|d7}|||ddkrtqdS)Nrr4i')randomrandintrurr:r;)ZlstZgc_ctrrrrr pop_and_collect9s  zFMappingTestCase.check_threaded_weak_dict_copy..pop_and_collectip)r>rr) rwrGrrjrxrtr?r@rArB)r type_rrrrrrrrrrrrZt_copyZ t_collectrrr check_threaded_weak_dict_copy#s4      z-MappingTestCase.check_threaded_weak_dict_copycCs|tjddSNFrrGrrrrr test_threaded_weak_key_dict_copy`sz0MappingTestCase.test_threaded_weak_key_dict_copycCs|tjddSr#rrrrr $test_threaded_weak_key_dict_deepcopyesz4MappingTestCase.test_threaded_weak_key_dict_deepcopycCs|tjddSrrrGrjrrrr "test_threaded_weak_value_dict_copyjsz2MappingTestCase.test_threaded_weak_value_dict_copycCs|tjddSr#rrrrr &test_threaded_weak_value_dict_deepcopyosz6MappingTestCase.test_threaded_weak_value_dict_deepcopycCst}||jjdSr)rGrjrQ_remove __closure__)r rrrr test_remove_closuretsz#MappingTestCase.test_remove_closureN)7r r rrurhrirkrmrnror{rrrrrrrrrrrr}rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr rUsf ! % % - =rU) mapping_testsc@s2eZdZedededdZejZddZdS)WeakValueDictionaryTestCaser4rSrn)rrkey3cCs |jSr)!_WeakValueDictionaryTestCase__refrsrrrr _referencesz&WeakValueDictionaryTestCase._referenceN) r r rrrrGrj type2testrrrrr r|src@s6eZdZeddeddeddiZejZddZd S) WeakKeyDictionaryTestCaserr4rrSrrncCs |jSr)_WeakKeyDictionaryTestCase__refrsrrrr rsz$WeakKeyDictionaryTestCase._referenceN) r r rrrrGrrrrrrr rsrc@sVeZdZGdddZddZddZddZd d Zd d Ze d dZ ddZ dS)FinalizeTestCasec@s eZdZdS)zFinalizeTestCase.ANrrrrr rsrcCstjjdkrtdS)NZcpython)sysimplementationnamerrrrrr _collect_if_necessarys z&FinalizeTestCase._collect_if_necessarycsfdd}|}gtj||dddd}||jd||||dd dif||d ||d||d||d||d||jd |d ggt||ddd}||||d if||||d if||d||d||d||d||jd |ggtj||dddd }~|||d||d||d||d||jd |d gdS)Ncs||||||Srrrrrresrr addsz+FinalizeTestCase.test_finalize..addC+Y)rT)rrrF)rrrr )rrGfinalizerTalivepeekdetachr )r rrrrr r test_finalizesB  zFinalizeTestCase.test_finalizec sfdd}|}gtj||ddddd}||||ddddf||ddddfg|t tj||dd Wdn1s0Y|t tj||dd Wdn1s0Y|ttj||ttjdS) Ncs||fdSrr)rkwargsr rr finsz-FinalizeTestCase.test_arg_errors..finr4rSrnr')funcrr)rr)rrr)rrGrrTrr]r^)r rrrrr r test_arg_errorss  . .z FinalizeTestCase.test_arg_errorsc Cs|}g}t||jd}t||jd}t||jd}t||jd}t||jd}~~||j||j||j||||j||d|||j|d||d~|||j|d |gd }| ||dS) Nf1f2f3f4f5rBrr)rrr!rrrrr) rrGrrtrvrrrsr rT) r rr rrrrr Zexpectedrrr test_orders6          zFinalizeTestCase.test_ordercsGdddtj}|}gfdd}|||}t|}t|}~~||||~||||||dgdS)Nc@s eZdZdS)z4FinalizeTestCase.test_all_freed..MyFinalizerNrrrrr MyFinalizersr#csddS)N{rrr rr r6sz1FinalizeTestCase.test_all_freed..callbackr$)rGrrr5rer rQrT)r r#rr6rZ wr_callbackZwr_frr r test_all_freeds        zFinalizeTestCase.test_all_freedcsRfdd}ttdt}ttdt}t|}ttdt}d|_dS)Ncs"ttd}tddddS)Ng1f3 errorr4r)rGrprint)r&clsrr errorsz,FinalizeTestCase.run_in_child..errorrrrF)rGrr( _global_varatexit)r*r+rrrrrr)r run_in_childs  zFinalizeTestCase.run_in_childcCsFd}td|\}}}|d}||gd|d|vdS)NzNfrom test.test_weakref import FinalizeTestCase;FinalizeTestCase.run_in_child()z-cascii)z f4 foobarr'r&z f1 foobarsZeroDivisionError)rZassert_python_okdecode splitlinesrTrv)r progrcouterrrrr test_atexit%s zFinalizeTestCase.test_atexitN) r r rrr rrr"r% classmethodr.r6rrrr rs)' ra Doctest for examples in the library reference: weakref.rst >>> import weakref >>> class Dict(dict): ... pass ... >>> obj = Dict(red=1, green=2, blue=3) # this object is weak referencable >>> r = weakref.ref(obj) >>> print(r() is obj) True >>> import weakref >>> class Object: ... pass ... >>> o = Object() >>> r = weakref.ref(o) >>> o2 = r() >>> o is o2 True >>> del o, o2 >>> print(r()) None >>> import weakref >>> class ExtendedRef(weakref.ref): ... def __init__(self, ob, callback=None, **annotations): ... super().__init__(ob, callback) ... self.__counter = 0 ... for k, v in annotations.items(): ... setattr(self, k, v) ... def __call__(self): ... '''Return a pair containing the referent and the number of ... times the reference has been called. ... ''' ... ob = super().__call__() ... if ob is not None: ... self.__counter += 1 ... ob = (ob, self.__counter) ... return ob ... >>> class A: # not in docs from here, just testing the ExtendedRef ... pass ... >>> a = A() >>> r = ExtendedRef(a, foo=1, bar="baz") >>> r.foo 1 >>> r.bar 'baz' >>> r()[1] 1 >>> r()[1] 2 >>> r()[0] is a True >>> import weakref >>> _id2obj_dict = weakref.WeakValueDictionary() >>> def remember(obj): ... oid = id(obj) ... _id2obj_dict[oid] = obj ... return oid ... >>> def id2obj(oid): ... return _id2obj_dict[oid] ... >>> a = A() # from here, just testing >>> a_id = remember(a) >>> id2obj(a_id) is a True >>> del a >>> try: ... id2obj(a_id) ... except KeyError: ... print('OK') ... else: ... print('WeakValueDictionary error') OK libreftestc Cs*ttttttttt t j t dSr) rZ run_unittestrEr>rUrrrrZ run_doctestrmodulesr rrrr test_mains r:__main__)r7))r:rZunittestrqrGrrrsr?r8rtestrZ test.supportrrrr,rrrrrr+ZTestCaser.rrDrErr>rUrZBasicTestMappingProtocolrrrr8Z__test__r:r rrrr sb   Ng c $S