U
    Nvf                     @   sl   d dl Z d dlmZ d dlmZmZ i ZG dd dZG dd deZdd	 Z	d
d Z
dd ZdddZdS )    N)partial)dumpsloadsc                   @   s&   e Zd Zd	ddZdd Zdd ZdS )
CloudpickledObjectWrapperFc                 C   s   || _ || _d S N_obj_keep_wrapper)selfobjkeep_wrapper r   M/tmp/pip-unpacked-wheel-dylwa62s/joblib/externals/loky/cloudpickle_wrapper.py__init__
   s    z"CloudpickledObjectWrapper.__init__c                 C   s(   t | j}| jst|ffS t|| jffS r   )r   r   r	   r   _reconstruct_wrapper)r
   _pickled_objectr   r   r   
__reduce__   s    

z$CloudpickledObjectWrapper.__reduce__c                 C   s   |dkrt | j|S t | |S )Nr   )getattrr   )r
   attrr   r   r   __getattr__   s    z%CloudpickledObjectWrapper.__getattr__N)F)__name__
__module____qualname__r   r   r   r   r   r   r   r   	   s   
r   c                   @   s   e Zd Zdd ZdS )CallableObjectWrapperc                 O   s   | j ||S r   )r   r
   argskwargsr   r   r   __call__   s    zCallableObjectWrapper.__call__N)r   r   r   r   r   r   r   r   r      s   r   c                 C   s    t | rt| |dS t| |dS )Nr   )callabler   r   )r   r   r   r   r   _wrap_non_picklable_objects#   s    r    c                 C   s   t | }t||S r   )r   r    )r   r   r   r   r   r   r   )   s    r   c                 C   s   dt | ddk}t| trLtt| jfdd | jD dd | j D S t| rt | dd}|t |d	d
t	j
@ O }t | dd}|d|kO }|s| S t| }|d krt| dd}|t| < |S )N__main__r    c                 S   s   g | ]}t |qS r   _wrap_objects_when_needed).0ar   r   r   
<listcomp>5   s     z-_wrap_objects_when_needed.<locals>.<listcomp>c                 S   s   i | ]\}}|t |qS r   r#   )r%   kvr   r   r   
<dictcomp>6   s    z-_wrap_objects_when_needed.<locals>.<dictcomp>__code__co_flagsr   r   z<lambda>Fr   )r   
isinstancer   r$   funcr   keywordsitemsr   inspect	CO_NESTED
WRAP_CACHEgetr    )r   Z	need_wrap	func_code	func_nameZwrapped_objr   r   r   r$   .   s.    

r$   Tc                    s8   t r,G  fdddt}j|_|S t dS )a  Wrapper for non-picklable object to use cloudpickle to serialize them.

    Note that this wrapper tends to slow down the serialization process as it
    is done with cloudpickle which is typically slower compared to pickle. The
    proper way to solve serialization issues is to avoid defining functions and
    objects in the main scripts and to implement __reduce__ functions for
    complex classes.
    c                       s   e Zd Z fddZdS )z<wrap_non_picklable_objects.<locals>.CloudpickledClassWrapperc                    s   ||| _  | _d S r   r   r   r   r   r   r   r   ]   s    zEwrap_non_picklable_objects.<locals>.CloudpickledClassWrapper.__init__N)r   r   r   r   r   r7   r   r   CloudpickledClassWrapper\   s   r8   r   )r1   isclassr   r   r    )r   r   r8   r   r7   r   wrap_non_picklable_objectsO   s
    
r:   )T)r1   	functoolsr   Zjoblib.externals.cloudpickler   r   r3   r   r   r    r   r$   r:   r   r   r   r   <module>   s   !