B \]i@sdZdddddgZiZdddZddZyeWnek rDYnXd d Zeeeed d Zd Z ddZ ddZ ddZ ddZ iZiZiZddZddZddZdS)zHelper to provide extensibility for pickle. This is only useful to add pickle support for extension types defined in C, not for instances of user-defined classes. pickle constructor add_extensionremove_extensionclear_extension_cacheNcCs,t|std|t|<|dk r(t|dS)Nz$reduction functions must be callable)callable TypeErrordispatch_tabler)Zob_typeZpickle_functionZconstructor_obr #/usr/local/lib/python3.7/copyreg.pyr s cCst|stddS)Nzconstructors must be callable)rr)objectr r r rscCst|j|jffS)N)complexrealimag)cr r r pickle_complex"srcCs<|tkrt|}n$|||}|jtjkr8||||S)N)r __new____init__)clsbasestateobjr r r _reconstructor)s     ric Cs|dks tx*|jjD]}t|dr|jt@sPqWt}|tkrFd}n ||jkr^td|j||}|j||f}y |j }WnNt k rt |ddrtddy |j }Wnt k rd}YnXYnX|}|rt ||fSt |fSdS)N __flags__zcan't pickle %s objects __slots__zNa class that defines __slots__ without defining __getstate__ cannot be pickled)AssertionError __class____mro__hasattrr _HEAPTYPEr r__name__ __getstate__AttributeErrorgetattr__dict__r)selfprotorrargsgetstatedictr r r _reduce_ex6s2       r*cGs|j|f|S)N)r)rr'r r r __newobj__Wsr+cCs|j|f||S)zUsed by pickle protocol 4, instead of __newobj__ to allow classes with keyword-only arguments to be pickled correctly. )r)rr'kwargsr r r __newobj_ex__Zsr-cCs|jd}|dk r|Sg}t|ds(nx|jD]}d|jkr0|jd}t|trX|f}xf|D]^}|dkrnq^q^|dr|ds|j d}|r| d||fq| |q^| |q^Wq0Wy ||_ Wn YnX|S)aReturn a list of slot names for a given class. This needs to find slots defined by the class and its bases, so we can't simply return the __slots__ attribute. We must walk down the Method Resolution Order and concatenate the __slots__ of each class found there. (This assumes classes don't modify their __slots__ attribute to misrepresent their slots after the class is defined.) __slotnames__Nr)r$ __weakref_____z_%s%s) r$getrr isinstancestr startswithendswithr lstripappendr.)rnamesrZslotsnameZstrippedr r r _slotnames`s2          r;cCst|}d|krdks&ntd||f}t||krNt||krNdS|tkrjtd|t|f|tkrtd|t|f|t|<|t|<dS)zRegister an extension code.izcode out of rangeNz)key %s is already registered with code %sz$code %s is already in use for key %s)int ValueError_extension_registryr2_inverted_registry)moduler:codekeyr r r rscCsR||f}t||ks$t||kr4td||ft|=t|=|tkrNt|=dS)z0Unregister an extension code. For testing only.z%key %s is not registered with code %sN)r?r2r@r>_extension_cache)rAr:rBrCr r r rs cCs tdS)N)rDclearr r r r rs)N)__doc____all__rrrr NameErrorrrrr*r+r-r;r?r@rDrrrr r r r s.    !<