B
    U[2                 @   s|  d Z ddlZede ddlZddlZddlmZ yddla	W n e
k
r\   ddl	a	Y nX ddlmZ ddlmZ ddlmZmZmZmZ yddlmZ W n  e
k
r   ddlmZ Y nX dd	lmZ ejreZeZndd
lmZ eefZy
t	jZ W n e!k
r   t	j"Z Y nX d:ddZ#e# Z$dd Z%dd Z&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/Z0G d#d$ d$e/Z1d;d%d&Z2d'd( Z3d)d* Z4d+d, Z5d-d. Z6e7e8e9fZ:d/d0 Z;d<d1d2Z<d=d3d4Z=d>d5d6Z>d7e.ee,e?e/ee1e$e+ee5iZ@eek	rXe0e@e< e)d8d9 eAe=iZBe@ ZCeB ZDdS )?z>Pickle related utilities. Perhaps this should be called 'can'.    Nz@ipykernel.pickleutil is deprecated. It has moved to ipyparallel.)FunctionType)	py3compat)import_item)string_types	iteritemsbuffer_to_bytesbuffer_to_bytes_py2)codeutil)
get_logger)	ClassTypec                s    fdd}t t|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.7/site-packages/ipykernel/pickleutil.pyinner1   s    z_get_cell_type.<locals>.innerr   )typer   get_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   interactive<   s    

r   c              C   sH   ddl } | ayddlm} W n tk
r0   Y nX | |_ttd dS )zuuse 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_dillN   s    r$   c              C   sH   ddl } | ayddlm} W n tk
r0   Y nX | |_ttd dS )z|use cloudpickle to expand serialization support
    
    adds support for object methods and closures to serialization.
    r   N)r   )cloudpickler   r    r   r!   r"   r#   r   )r%   r   r   r   r   use_cloudpicklef   s    r&   c               @   s$   e Zd Zg dfddZdddZdS )CannedObjectNc             C   sL   || _ t|| _t|| _x$|D ]}t| j|tt|| q"W 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.
        
        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 }x&| jD ]}t||tt||| qW | jrZt| j|| _| || | j S )N)r*   r(   r-   uncanr.   r,   )r0   gr*   r1   r   r   r   
get_object   s    zCannedObject.get_object)N)r   r   __qualname__r2   r5   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 )
	Referencez/object for wrapping a remote reference by name.c             C   s&   t |tstd| || _g | _d S )Nzillegal name: %r)r   r   	TypeErrornamer/   )r0   r9   r   r   r   r2      s    
zReference.__init__c             C   s
   d| j  S )Nz<Reference: %r>)r9   )r0   r   r   r   __repr__   s    zReference.__repr__Nc             C   s   |d kri }t | j|S )N)evalr9   )r0   r4   r   r   r   r5      s    zReference.get_object)N)r   r   r6   __doc__r2   r:   r5   r   r   r   r   r7      s   r7   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 )N)r+   cell_contents)r0   cellr   r   r   r2      s    zCannedCell.__init__Nc                s&   t | j|  fdd}t|d S )Nc                  s    S )Nr   r   )r>   r   r   r      s    z$CannedCell.get_object.<locals>.innerr   )r3   r>   r   r   )r0   r4   r   r   )r>   r   r5      s    zCannedCell.get_object)N)r   r   r6   r<   r2   r5   r   r   r   r   r=      s   r=   c               @   s&   e Zd Zdd Zdd ZdddZdS )	CannedFunctionc             C   sz   |  | |j| _|jr,dd |jD | _nd | _t|}|rVtdd |D | _nd | _|j	pdd| _
|j| _g | _d S )Nc             S   s   g | ]}t |qS r   )r+   ).0fdr   r   r   
<listcomp>   s    z+CannedFunction.__init__.<locals>.<listcomp>c             s   s   | ]}t |V  qd S )N)r+   )rA   r?   r   r   r   	<genexpr>   s    z*CannedFunction.__init__.<locals>.<genexpr>r   )_check_typer   coder   defaultsr   r   tupleclosurer   moduler   r/   )r0   r   rI   r   r   r   r2      s    

zCannedFunction.__init__c             C   s   t |tstdd S )NzNot a function type)r   r   AssertionError)r0   r*   r   r   r   rE      s    zCannedFunction._check_typeNc                s   | j ds$t| j  tj| j  j  d kr0i  | jrPt fdd| jD }nd }| jrtt fdd| jD }nd }t	| j
 | j||}|S )N__c             3   s   | ]}t | V  qd S )N)r3   )rA   Zcfd)r4   r   r   rD      s    z,CannedFunction.get_object.<locals>.<genexpr>c             3   s   | ]}t | V  qd S )N)r3   )rA   r?   )r4   r   r   rD      s    )rJ   
startswithr   sysmodulesr   rG   rH   rI   r   rF   r   )r0   r4   rG   rI   ZnewFuncr   )r4   r   r5      s    
zCannedFunction.get_object)N)r   r   r6   r2   rE   r5   r   r   r   r   r@      s   r@   c               @   s&   e Zd Zdd Zdd ZdddZdS )	CannedClassc             C   s   |  | |j| _t|t | _i | _x,|j D ]\}}|dkr2t	|| j|< q2W | jr`g }n|
 }dd |dd  D | _g | _d S )N)__weakref__r   c             S   s   g | ]}t |qS r   )r+   )rA   cr   r   r   rC      s    z(CannedClass.__init__.<locals>.<listcomp>   )rE   r   r9   r   r   Z	old_style_canned_dictr   itemsr+   mroparentsr/   )r0   clskvrV   r   r   r   r2      s    
zCannedClass.__init__c             C   s   t |tstdd S )NzNot a class type)r   
class_typerK   )r0   r*   r   r   r   rE     s    zCannedClass._check_typeNc                s0   t  fdd| jD }t| j|t| j dS )Nc             3   s   | ]}t | V  qd S )N)r3   )rA   p)r4   r   r   rD     s    z)CannedClass.get_object.<locals>.<genexpr>)r4   )rH   rW   r   r9   
uncan_dictrT   )r0   r4   rW   r   )r4   r   r5     s    zCannedClass.get_object)N)r   r   r6   r2   rE   r5   r   r   r   r   rP      s   rP   c               @   s   e Zd Zdd ZdddZdS )CannedArrayc             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 )	Nr   )ascontiguousarrayFTOc             s   s   | ]\}}|d kV  qdS )r`   Nr   )rA   ZdtZszr   r   r   rD     s    z'CannedArray.__init__.<locals>.<genexpr>)dtype)numpyr_   shapera   ZfieldsZdescrstrpickledsumanyvaluesr   dumpsPICKLE_PROTOCOLr/   buffer)r0   r*   r_   r   r   r   r2   	  s    
"zCannedArray.__init__Nc             C   s`   ddl m} | jd }| jr*tt|S tjsFt	|t
rFt| }||| jd| jS d S )Nr   )
frombuffer)ra   )rb   rl   r/   re   r   loadsr   r   PY3r   
memoryviewrk   tobytesra   Zreshaperc   )r0   r4   rl   datar   r   r   r5     s    
zCannedArray.get_object)N)r   r   r6   r2   r5   r   r   r   r   r^     s   r^   c               @   s&   e Zd ZeeZdd ZdddZdS )CannedBytesc             C   s   |g| _ d S )N)r/   )r0   r*   r   r   r   r2   .  s    zCannedBytes.__init__Nc             C   s   | j d }| |S )Nr   )r/   wrap)r0   r4   rq   r   r   r   r5   1  s    
zCannedBytes.get_object)N)r   r   r6   staticmethodr   rs   r2   r5   r   r   r   r   rr   +  s   rr   c               @   s   e Zd ZeZdS )CannedBufferN)r   r   r6   rk   rs   r   r   r   r   ru   5  s   ru   c               @   s   e Zd ZeZdS )CannedMemoryViewN)r   r   r6   ro   rs   r   r   r   r   rv   8  s   rv   c          	   C   s   t  }|d xxt|  D ]h\}}t|tryt|}W n: tk
rv   |rh||krh|jd|dd | 	| Y qX | 	|| |< qW dS )z2import any string-keys in a type mapping
    
    zImporting canning mapz canning class not importable: %rT)exc_infoN)
r
   debuglistrU   r   r   r   	Exceptionerrorr#   )mappingZoriginallogr1   valuerX   r   r   r   _import_mapping?  s    

r   c             C   s<   t |tr,x|D ]}t| |krdS qW dS t| |kS dS )zRlike isinstance(obj, check), but strict
    
    This won't catch subclasses.
    TFN)r   rH   r   )r*   ZcheckrX   r   r   r   istypeQ  s    

r   c             C   sX   d}x8t tD ],\}}t|tr(d}P qt| |r|| S qW |rTttt t| S | S )zprepare an object for picklingFT)r   r"   r   r   r   r   _original_can_mapr+   )r*   import_neededrX   Zcannerr   r   r   r+   ^  s    


r+   c             C   s$   t | tr| jdkrt| S | S d S )Nr   )r   r[   r   rP   )r*   r   r   r   	can_classr  s    r   c             C   s<   t | tr4i }x t| D ]\}}t|||< qW |S | S dS )zcan the *values* of a dictN)r   dictr   r+   )r*   newobjrY   rZ   r   r   r   can_dictx  s    
r   c             C   s,   t | tr$t| }|dd | D S | S dS )zcan the elements of a sequencec             S   s   g | ]}t |qS r   )r+   )rA   ir   r   r   rC     s    z can_sequence.<locals>.<listcomp>N)r   sequence_typesr   )r*   tr   r   r   can_sequence  s    
r   c             C   s\   d}x:t tD ].\}}t|tr(d}P qt| |r|| |S qW |rXttt t| |S | S )zinvert canningFT)r   	uncan_mapr   r   r   _original_uncan_mapr3   )r*   r4   r   rX   Zuncannerr   r   r   r3     s    



r3   c             C   s>   t | tr6i }x"t| D ]\}}t||||< qW |S | S d S )N)r   r   r   r3   )r*   r4   r   rY   rZ   r   r   r   r]     s    
r]   c                s0   t | tr(t| }| fdd| D S | S d S )Nc                s   g | ]}t | qS r   )r3   )rA   r   )r4   r   r   rC     s    z"uncan_sequence.<locals>.<listcomp>)r   r   r   )r*   r4   r   r   )r4   r   uncan_sequence  s    
r   znumpy.ndarrayc             C   s
   |  |S )N)r5   )r*   r4   r   r   r   <lambda>  s    r   )N)N)N)N)N)Er<   warningswarnDeprecationWarningr)   rN   typesr   ZcPickler   r!   Zipython_genutilsr   Zipython_genutils.importstringr   Zipython_genutils.py3compatr   r   r   r   Zipyparallel.serializer	   r    Ztraitlets.logr
   rn   ro   rk   r   r[   r   ZDEFAULT_PROTOCOLrj   AttributeErrorZHIGHEST_PROTOCOLr   Z	cell_typer   r$   r&   objectr'   r7   r=   r@   rP   r^   rr   ru   rv   r   r   r+   r   r   ry   rH   setr   r   r3   r]   r   bytesr"   r   r   r   r   r   r   r   r   <module>   s|   

'*#





	

