U
    e3                     @   s  U d Z ddlZddlZejdedd ddlZddladdlZddlm	Z	 ddl
mZ ddlmZ dd	lmZ eZeZtjZd:d
dZe Zdd Zdd Zdd ZG dd dZG dd deZG dd deZG dd deZG dd deZG dd deZ G dd deZ!G d d! d!e!Z"G d"d# d#e!Z#d;d$d%Z$d&d' Z%d(d) Z&d*d+ Z'd,d- Z(e)e*e+fZ,d.d/ Z-d<d0d1Z.d=d2d3Z/d>d4d5Z0d6e e	ee1e!ee#eeee'iZ2eek	re"e2e< ed7d8 e3e/iZ4ej5eej6f e7d9< e2 Z8e4 Z9dS )?z>Pickle related utilities. Perhaps this should be called 'can'.    Nz@ipykernel.pickleutil is deprecated. It has moved to ipyparallel.   )
stacklevel)FunctionType)codeutil)
get_logger)import_itemc                    s    fdd}t |jd S )zUthe type of a closure cell doesn't seem to be importable,
    so just create one
    c                      s    S N r	   ar	   3lib/python3.8/site-packages/ipykernel/pickleutil.pyinner#   s    z_get_cell_type.<locals>.innerr   )type__closure__)r   r   r	   r
   r   _get_cell_type   s    r   c                 C   s2   t | tr(td}t| j|j| j| j} d| _| S )zdecorator for making functions appear as interactively defined.
    This results in the function being linked to the user_ns as globals()
    instead of the module globals().
    __main__)
isinstancer   
__import____code____dict____name____defaults__
__module__)fZmainmodr	   r	   r   interactive0   s    
r   c                  C   sH   ddl } | azddlm} W n tk
r0   Y nX | |_ttd dS )zquse dill to expand serialization support

    adds support for object methods and closures to serialization.
    r   N	serialize)dillpickle	ipykernelr   ImportErrorcan_mappopr   )r   r   r	   r	   r   use_dillE   s    r#   c                  C   sH   ddl } | azddlm} W n tk
r0   Y nX | |_ttd dS )zxuse cloudpickle to expand serialization support

    adds support for object methods and closures to serialization.
    r   Nr   )cloudpickler   r   r   r    r!   r"   r   )r$   r   r	   r	   r   use_cloudpickle^   s    r%   c                   @   s$   e Zd ZdZdddZdddZdS )	CannedObjectzA canned object.Nc                 C   sL   |pg | _ t|| _t|| _|D ]}t| j|tt|| q$g | _dS )a  can an object for safe pickling

        Parameters
        ----------
        obj
            The object to be canned
        keys : list (optional)
            list of attribute names that will be explicitly canned / uncanned
        hook : callable (optional)
            An optional extra callable,
            which can do additional processing of the uncanned object.

        Notes
        -----
        large data may be offloaded into the buffers list,
        used for zero-copy transfers.
        N)keyscopyobjcanhooksetattrgetattrbuffers)selfr)   r'   r+   keyr	   r	   r   __init__{   s    

zCannedObject.__init__c                 C   s\   |dkri }| j }| jD ]}t||tt||| q| jrVt| j|| _| || | j S )zGet an object.N)r)   r'   r,   uncanr-   r+   )r/   gr)   r0   r	   r	   r   
get_object   s    
zCannedObject.get_object)NN)Nr   r   __qualname____doc__r1   r4   r	   r	   r	   r   r&   x   s   
r&   c                   @   s*   e Zd ZdZdd Zdd Zd	ddZdS )
	Referencez/object for wrapping a remote reference by name.c                 C   s&   t |tstd| || _g | _dS )zInitialize the reference.zillegal name: %rN)r   str	TypeErrornamer.   )r/   r;   r	   r	   r   r1      s    
zReference.__init__c                 C   s
   d| j  S )z%Get the string repr of the reference.z<Reference: %r>)r;   )r/   r	   r	   r   __repr__   s    zReference.__repr__Nc                 C   s   |dkri }t | j|S )zGet an object in the reference.N)evalr;   )r/   r3   r	   r	   r   r4      s    zReference.get_object)N)r   r   r6   r7   r1   r<   r4   r	   r	   r	   r   r8      s   r8   c                   @   s"   e Zd ZdZdd ZdddZdS )
CannedCellzCan a closure cellc                 C   s   t |j| _dS )zInitialize the canned cell.N)r*   cell_contents)r/   cellr	   r	   r   r1      s    zCannedCell.__init__Nc                    s"   t | j|  fdd}|jd S )zGet an object in the cell.c                      s    S )zInner function.r	   r	   r?   r	   r   r      s    z$CannedCell.get_object.<locals>.innerr   )r2   r?   r   )r/   r3   r   r	   rA   r   r4      s    zCannedCell.get_object)Nr5   r	   r	   r	   r   r>      s   r>   c                   @   s*   e Zd ZdZdd Zdd Zd	ddZdS )
CannedFunctionzCan a function.c                 C   s~   |  | |j| _|  |jr0dd |jD | _nd| _|  |j}|rZtdd |D | _nd| _|jphd| _	|j
| _
g | _dS )zInitialize the canc                 S   s   g | ]}t |qS r	   r*   ).0fdr	   r	   r   
<listcomp>   s     z+CannedFunction.__init__.<locals>.<listcomp>Nc                 s   s   | ]}t |V  qd S r   rC   rD   r@   r	   r	   r   	<genexpr>   s     z*CannedFunction.__init__.<locals>.<genexpr>r   )_check_typer   coder   defaultsr   tupleclosurer   moduler   r.   )r/   r   rM   r	   r	   r   r1      s    
zCannedFunction.__init__c                 C   s   t |tstdd S )NzNot a function type)r   r   AssertionErrorr/   r)   r	   r	   r   rI      s    zCannedFunction._check_typeNc                    s   | j ds$t| j  tj| j  j  dkr0i  | jrNt fdd| jD nd}| jrpt fdd| jD nd}t	| j
 | j||S )zGet an object out of the can.__Nc                 3   s   | ]}t | V  qd S r   r2   )rD   Zcfdr3   r	   r   rH      s     z,CannedFunction.get_object.<locals>.<genexpr>c                 3   s   | ]}t | V  qd S r   rR   rG   rS   r	   r   rH      s     )rN   
startswithr   sysmodulesr   rK   rL   rM   r   rJ   r   )r/   r3   rK   rM   r	   rS   r   r4      s    
""zCannedFunction.get_object)Nr   r   r6   r7   r1   rI   r4   r	   r	   r	   r   rB      s   rB   c                   @   s*   e Zd ZdZdd Zdd Zd	ddZdS )
CannedClasszA canned class object.c                 C   s   |  | |j| _t|t | _i | _|j D ]\}}|dkr0t	|| j|< q0| jrZg n|
 }dd |dd D | _g | _dS )Initialize the can.)__weakref__r   c                 S   s   g | ]}t |qS r	   rC   )rD   cr	   r	   r   rF     s     z(CannedClass.__init__.<locals>.<listcomp>   N)rI   r   r;   r   r   Z	old_style_canned_dictr   itemsr*   mroparentsr.   )r/   clskvr_   r	   r	   r   r1      s    
zCannedClass.__init__c                 C   s   t |tstdd S )NzNot a class type)r   
class_typerO   rP   r	   r	   r   rI     s    zCannedClass._check_typeNc                    s0   t  fdd| jD }t| j|t| j dS )zGet an object from the can.c                 3   s   | ]}t | V  qd S r   rR   )rD   prS   r	   r   rH   
  s     z)CannedClass.get_object.<locals>.<genexpr>rS   )rL   r`   r   r;   
uncan_dictr]   )r/   r3   r`   r	   rS   r   r4     s    zCannedClass.get_object)NrW   r	   r	   r	   r   rX      s   rX   c                   @   s"   e Zd ZdZdd ZdddZdS )CannedArrayzA canned numpy array.c                 C   s   ddl m} |j| _|jjr$|jjn|jj| _d| _t|jdkrJd| _n:|jdkr\d| _n(|jjrt	dd |jj
 D rd| _| jrt|tg| _n||dd	}t|g| _dS )
rY   r   )ascontiguousarrayFTOc                 s   s   | ]\}}|d kV  qdS )ri   Nr	   )rD   ZdtZszr	   r	   r   rH     s     z'CannedArray.__init__.<locals>.<genexpr>Ndtype)numpyrh   shaperk   ZfieldsZdescrr9   pickledsumanyvaluesr   dumpsPICKLE_PROTOCOLr.   buffer)r/   r)   rh   r	   r	   r   r1     s    
"zCannedArray.__init__Nc                 C   s<   ddl m} | jd }| jr&t|S ||| jd| jS )zGet the object.r   )
frombufferrj   )	rl   ru   r.   rn   r   loadsrk   Zreshaperm   )r/   r3   ru   datar	   r	   r   r4   '  s
    

zCannedArray.get_object)Nr5   r	   r	   r	   r   rg     s   rg   c                   @   sD   e Zd ZdZeejeeej	f edddZ
dd Zd
dd	ZdS )CannedByteszA canned bytes object.)bufreturnc                 C   s(   t | tr|  S t | ts$t| S | S )z+Cast a buffer or memoryview object to bytes)r   
memoryviewtobytesbytes)ry   r	   r	   r   wrap5  s
    

zCannedBytes.wrapc                 C   s   |g| _ dS )rY   N)r.   rP   r	   r	   r   r1   >  s    zCannedBytes.__init__Nc                 C   s   | j d }| |S )zGet the canned object.r   )r.   r~   )r/   r3   rw   r	   r	   r   r4   B  s    
zCannedBytes.get_object)N)r   r   r6   r7   staticmethodtypingZUnionr{   r}   ZSupportsBytesr~   r1   r4   r	   r	   r	   r   rx   2  s
    rx   c                   @   s   e Zd ZdZeZdS )CannedBufferzA canned buffer.N)r   r   r6   r7   rt   r~   r	   r	   r	   r   r   H  s   r   c                   @   s   e Zd ZdZeZdS )CannedMemoryViewzA canned memory view.N)r   r   r6   r7   r{   r~   r	   r	   r	   r   r   N  s   r   c              	   C   s   t  }|d t|  D ]h\}}t|trzt|}W n: tk
rt   |rf||krf|jd|dd | 	| Y qX | 	|| |< qdS )z(import any string-keys in a type mappingzImporting canning mapz canning class not importable: %rT)exc_infoN)
r   debuglistr^   r   r9   r   	Exceptionerrorr"   )mappingZoriginallogr0   _ra   r	   r	   r   _import_mappingY  s    

r   c                    s,   t |tr t fdd|D S t |kS )zNlike isinstance(obj, check), but strict

    This won't catch subclasses.
    c                 3   s   | ]}t  |kV  qd S r   )r   )rD   ra   r)   r	   r   rH   p  s     zistype.<locals>.<genexpr>)r   rL   rp   r   )r)   checkr	   r   r   istypej  s    
r   c                 C   sX   d}t  D ]0\}}t|tr&d} q>t| |r||   S q|rTtt t t| S | S )zprepare an object for picklingFT)r!   r^   r   r9   r   r   _original_can_mapr*   )r)   import_neededra   Zcannerr	   r	   r   r*   t  s    


r*   c                 C   s    t | tr| jdkrt| S | S )zCan a class object.r   )r   rd   r   rX   r   r	   r	   r   	can_class  s    r   c                 C   s4   t | tr0i }|  D ]\}}t|||< q|S | S )zcan the *values* of a dict)r   dictr^   r*   )r)   newobjrb   rc   r	   r	   r   can_dict  s    
r   c                 C   s(   t | tr$t| }|dd | D S | S )zcan the elements of a sequencec                 S   s   g | ]}t |qS r	   rC   rD   ir	   r	   r   rF     s     z can_sequence.<locals>.<listcomp>r   sequence_typesr   )r)   tr	   r	   r   can_sequence  s    
r   c                 C   s\   d}t  D ]2\}}t|tr&d} q@t| |r|| |  S q|rXtt t t| |S | S )zinvert canningFT)	uncan_mapr^   r   r9   r   _original_uncan_mapr2   )r)   r3   r   ra   Zuncannerr	   r	   r   r2     s    



r2   c                 C   s6   t | tr2i }|  D ]\}}t||||< q|S | S )zUncan a dict object.)r   r   r^   r2   )r)   r3   r   rb   rc   r	   r	   r   rf     s    
rf   c                    s,   t | tr(t| }| fdd| D S | S )zUncan a sequence.c                    s   g | ]}t | qS r	   rR   r   rS   r	   r   rF     s     z"uncan_sequence.<locals>.<listcomp>r   )r)   r3   r   r	   rS   r   uncan_sequence  s    
r   znumpy.ndarrayc                 C   s
   |  |S r   )r4   )r)   r3   r	   r	   r   <lambda>      r   r   )N)N)N)N)N):r7   r   warningswarnDeprecationWarningr(   r   rU   typesr   Zipyparallel.serializer   Ztraitlets.logr   Ztraitlets.utils.importstringr   r{   rt   r   rd   ZDEFAULT_PROTOCOLrs   r   Z	cell_typer   r#   r%   r&   r8   r>   rB   rX   rg   rx   r   r   r   r   r*   r   r   r   rL   setr   r   r2   rf   r   r}   r!   r   r   ZDictZAny__annotations__r   r   r	   r	   r	   r   <module>   s~   
+)$







      
  