a `]_%@sddlmZmZmZmZddlmZmZmZm Z m Z m Z ddl m Z ddZGdddeZeZdd ZGd d d eed ZGd ddeZdS))InvariantException CheckedType_restore_picklestore_invariants) set_fields check_typeis_field_ignore_extra_complaintPFIELD_NO_INITIAL serializecheck_global_invariants transformcCst|dko|dtkS)Nr)lenr)basesr8/usr/lib64/python3.9/site-packages/pyrsistent/_pclass.py _is_pclasssrcseZdZfddZZS) PClassMetacsht||ddt||dddtdd|dD|d<t|rR|dd 7<tt|||||S) N_pclass_fields)name_pclass_invariantsZ __invariant__)_pclass_frozencss|] }|VqdSNr.0keyrrr z%PClassMeta.__new__.. __slots__) __weakref__)rrtuplersuperr__new__)ZmcsrrZdct __class__rrr# s zPClassMeta.__new__)__name__ __module__ __qualname__r# __classcell__rrr$rr srcCs<t||||||\}}|s,||n t|||dSr)rZ invariantappendsetattr)clsfieldrvalueresultinvariant_errorsZis_okZ error_coderrr_check_and_set_attrs  r1cseZdZdZfddZddZed"dd Zd#d d Zd d Z ddZ ddZ ddZ fddZ ddZddZddZddZddZd d!ZZS)$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}|jD]\}}||vr|dusZ||vrtt||rz|j|||d} q|||} n||} t|||| ||||=q:|j t urt |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)setrgetattr_MISSING_VALUEr%)selfargsr>r?rr.rrrr@Rs   z PClass.setNFcs:t|rS|r&fdd|jD|f||dS)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)rkr>rr rz!PClass.create..)r3r4) isinstancer)r,r>r3r4rrFrcreaters 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||jr:|jD]"}t||tt||tkrdSqdStS)NFT)rHr%rrArBNotImplemented)rCotherrrrr__eq__s   z PClass.__eq__cCs ||k Srr)rCrKrrr__ne__sz PClass.__ne__csttfddjDS)Nc3s|]}|t|tfVqdSr)rArBrrCrrrrz"PClass.__hash__..)hashr!rrNrrNr__hash__szPClass.__hash__cs2t|ddrtd||tt|||dS)NrFz'Can't set attribute, key={0}, value={1})rAr<r;r"r2 __setattr__rCrr.r$rrrQs 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_dicts    zPClass._to_dictcCs(d|jjddd|DS)Nz{0}({1})r5css"|]\}}d|t|VqdS)z{0}={1}N)r;repr)rrEvrrrrrz"PClass.__repr__..)r;r%r&r=rTr7rNrrr__repr__s zPClass.__repr__cs&tfddjD}tj|ffS)Nc3s&|]}t|r|t|fVqdSr)hasattrrArrNrrrrz$PClass.__reduce__..)dictrrr%)rCdatarrNr __reduce__szPClass.__reduce__cCst||S)z5 Returns an evolver for this object. )_PClassEvolverrTrNrrrevolverszPClass.evolvercCs|}||=|S)z Remove attribute given by name from the current instance. Raises AttributeError if the attribute doesn't exist. )r] persistent)rCrr]rrrremovesz PClass.remove)NF)N)r&r'r(__doc__r#r@ classmethodrIr r rLrMrPrQrSrTrWr[r]r_r)rrr$rr2%s" $       r2) metaclasscs`eZdZdZddZddZddZdd Zd d Zd d Z ddZ fddZ ddZ Z S)r\)_pclass_evolver_original_pclass_evolver_data_pclass_evolver_data_is_dirtyr3cCs||_||_d|_t|_dS)NF)rcrdrer@r3)rCoriginalZ initial_dictrrr__init__sz_PClassEvolver.__init__cCs |j|Sr)rdrCitemrrr __getitem__sz_PClassEvolver.__getitem__cCs2|j|t|ur.||j|<|j|d|_|SNT)rdgetrBr3addrerRrrrr@s   z_PClassEvolver.setcCs|||dSr)r@rRrrr __setitem__sz_PClassEvolver.__setitem__cCs4||jvr(|j|=|j|d|_|St|dSrk)rdr3discardrer<rhrrrr_s   z_PClassEvolver.removecCs||dSr)r_rhrrr __delitem__sz_PClassEvolver.__delitem__cCs&|jr |jjfd|ji|jS|jS)Nr3)rercr%r3rdrNrrrr^s z_PClassEvolver.persistentcs.||jvr|||ntt|||dSr)rr@r"r\rQrRr$rrrQs 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 rtyperobjectrBr1r2r\rrrrs    1