a `Å]_æ%ã@s’ddlmZmZmZmZddlmZmZmZm Z m Z m Z ddl m Z dd„ZGdd„deƒZeƒZdd „ZGd d „d eed �ZGd d„deƒZdS)é)ÚInvariantExceptionÚ CheckedTypeÚ_restore_pickleÚstore_invariants)Ú set_fieldsÚ check_typeÚis_field_ignore_extra_complaintÚPFIELD_NO_INITIALÚ serializeÚcheck_global_invariants©Ú transformcCst|ƒdko|dtkS)Nér)Úlenr)Úbases©rú8/usr/lib64/python3.9/site-packages/pyrsistent/_pclass.pyÚ _is_pclasssrcseZdZ‡fdd„Z‡ZS)Ú PClassMetacsht||dd�t||ddƒdtdd„|dDƒƒ|d<t|ƒrR|dd 7<tt|ƒ ||||¡S) NÚ_pclass_fields)ÚnameÚ_pclass_invariantsZ __invariant__)Ú_pclass_frozencss|] }|VqdS©Nr©Ú.0ÚkeyrrrÚ óz%PClassMeta.__new__..Ú __slots__)Ú __weakref__)rrÚtuplerÚsuperrÚ__new__)ZmcsrrZdct©Ú __class__rrr# s zPClassMeta.__new__)Ú__name__Ú __module__Ú __qualname__r#Ú __classcell__rrr$rr srcCs<t||||ƒ| |¡\}}|s,| |¡n t|||ƒdSr)rZ invariantÚappendÚsetattr)ÚclsÚfieldrÚvalueÚresultÚinvariant_errorsZis_okZ error_coderrrÚ_check_and_set_attrs  r1csœeZdZdZ‡fdd„Zdd„Zed"dd „ƒZd#d d „Zd d „Z dd„Z dd„Z dd„Z ‡fdd„Z dd„Zdd„Zdd„Zdd„Zdd„Zd d!„Z‡ZS)$ÚPClassa­ A PClass is a python class with a fixed set of specified fields. PClasses are declared as python classes inheriting from PClass. It is defined the same way that PRecords are and behaves like a PRecord in all aspects except that it is not a PMap and hence not a collection but rather a plain Python object. More documentation and examples of PClass usage is available at https://github.com/tobgu/pyrsistent c  sRtt|ƒ |¡}| dd¡}| dd¡}g}g}|j ¡D]Â\}}||vr¬|dusZ||vrŠtt||ƒrz|j|||d�} q’| ||¡} n||} t|||| ||ƒ||=q:|j t urât |j ƒrÈ|  ¡n|j } t|||| ||ƒq:|j r:|  d |j|¡¡q:|�s |�rtt|ƒt|ƒdƒ‚|�r>> from pyrsistent import PClass, field >>> class AClass(PClass): ... x = field() ... >>> a = AClass(x=1) >>> a2 = a.set(x=2) >>> a3 = a.set('x', 3) >>> a AClass(x=1) >>> a2 AClass(x=2) >>> a3 AClass(x=3) rrr3)ÚsetrÚgetattrÚ_MISSING_VALUEr%)ÚselfÚargsr>r?rr.rrrr@Rs   z PClass.setNFcs:tˆ|ƒrˆS|r&‡fdd„|jDƒ‰|f||dœˆ¤ŽS)a: Factory method. Will create a new PClass of the current type and assign the values specified in kwargs. :param ignore_extra: A boolean which when set to True will ignore any keys which appear in kwargs that are not in the set of fields on the PClass. csi|]}|ˆvr|ˆ|“qSrr)rÚk©r>rrÚ rz!PClass.create..)r3r4)Ú isinstancer)r,r>r3r4rrFrÚcreaters z PClass.createcCs@i}|jD]0}t||tƒ}|tur t|j|j||ƒ||<q |S)z‚ Serialize the current PClass using custom serializer functions for fields where such have been supplied. )rrArBr Z serializer)rCr;r/rr.rrrr ƒs   zPClass.serializecGs t||ƒS)aT Apply transformations to the currency PClass. For more details on transformations see the documentation for PMap. Transformations on PClasses do not support key matching since the PClass is not a collection. Apart from that the transformations available for other persistent types work as expected. r )rCZtransformationsrrrr �szPClass.transformcCs>t||jƒr:|jD]"}t||tƒt||tƒkrdSqdStS)NFT)rHr%rrArBÚNotImplemented)rCÚotherrrrrÚ__eq__™s   z PClass.__eq__cCs ||k Srr)rCrKrrrÚ__ne__£sz PClass.__ne__cstt‡fdd„ˆjDƒƒƒS)Nc3s|]}|tˆ|tƒfVqdSr)rArBr©rCrrr¨rz"PClass.__hash__..)Úhashr!rrNrrNrÚ__hash__¦szPClass.__hash__cs2t|ddƒrtd ||¡ƒ‚tt|ƒ ||¡dS)NrFz'Can't set attribute, key={0}, value={1})rAr<r;r"r2Ú __setattr__©rCrr.r$rrrQªs zPClass.__setattr__cCstd |¡ƒ‚dS)Nz-Can't delete attribute, key={0}, use remove())r<r;)rCrrrrÚ __delattr__°szPClass.__delattr__cCs0i}|jD] }t||tƒ}|tur |||<q |Sr)rrArB)rCr/rr.rrrÚ_to_dict³s    zPClass._to_dictcCs(d |jjd dd„| ¡ ¡Dƒ¡¡S)Nz{0}({1})r5css"|]\}}d |t|ƒ¡VqdS)z{0}={1}N)r;Úrepr)rrEÚvrrrr¾rz"PClass.__repr__..)r;r%r&r=rTr7rNrrrÚ__repr__¼s ÿzPClass.__repr__cs&t‡fdd„ˆjDƒƒ}tˆj|ffS)Nc3s&|]}tˆ|ƒr|tˆ|ƒfVqdSr)ÚhasattrrArrNrrrÂrz$PClass.__reduce__..)Údictrrr%)rCÚdatarrNrÚ __reduce__ÀszPClass.__reduce__cCst|| ¡ƒS)z5 Returns an evolver for this object. )Ú_PClassEvolverrTrNrrrÚevolverÅszPClass.evolvercCs| ¡}||=| ¡S)z‰ Remove attribute given by name from the current instance. Raises AttributeError if the attribute doesn't exist. )r]Ú persistent)rCrr]rrrÚremoveËsz PClass.remove)NF)N)r&r'r(Ú__doc__r#r@Ú classmethodrIr r rLrMrPrQrSrTrWr[r]r_r)rrr$rr2%s" $       r2)Ú metaclasscs`eZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z ‡fdd„Z dd„Z ‡Z S)r\)Ú_pclass_evolver_originalÚ_pclass_evolver_dataÚ_pclass_evolver_data_is_dirtyr3cCs||_||_d|_tƒ|_dS)NF)rcrdrer@r3)rCÚoriginalZ initial_dictrrrÚ__init__Øsz_PClassEvolver.__init__cCs |j|Sr)rd©rCÚitemrrrÚ __getitem__Þsz_PClassEvolver.__getitem__cCs2|j |t¡|ur.||j|<|j |¡d|_|S©NT)rdÚgetrBr3ÚaddrerRrrrr@ás   z_PClassEvolver.setcCs| ||¡dSr)r@rRrrrÚ __setitem__ész_PClassEvolver.__setitem__cCs4||jvr(|j|=|j |¡d|_|St|ƒ‚dSrk)rdr3Údiscardrer<rhrrrr_ìs   z_PClassEvolver.removecCs| |¡dSr)r_rhrrrÚ __delitem__õsz_PClassEvolver.__delitem__cCs&|jr |jjfd|ji|j¤ŽS|jS)Nr3)rercr%r3rdrNrrrr^øs ÿz_PClassEvolver.persistentcs.||jvr| ||¡ntt|ƒ ||¡dSr)rr@r"r\rQrRr$rrrQÿs z_PClassEvolver.__setattr__cCs||SrrrhrrrÚ __getattr__sz_PClassEvolver.__getattr__)r&r'r(rrgrjr@rnr_rpr^rQrqr)rrr$rr\Õs  r\N)Zpyrsistent._checked_typesrrrrZpyrsistent._field_commonrrrr r r Zpyrsistent._transformationsr rÚtyperÚobjectrBr1r2r\rrrrÚs    1