B
    |ba4                 @   s  d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZddl	m
Z
 ddl
mZ ddlmZmZmZ ddlmZmZ dd	gZejd
krdn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dd Zdd	 ZdS )    )absolute_importN   )compat)numeric_types)BaseHandlerregister
unregister)	b64decode	b64encoderegister_handlersunregister_handlerslittle<>c             C   s   | j j}|dkrtS |S )z%translate equals sign to native order=)dtype	byteordernative_byteorder)arrr    r   3lib/python3.7/site-packages/jsonpickle/ext/numpy.pyget_byteorder   s    r   c               @   s   e Zd Zdd Zdd ZdS )NumpyBaseHandlerc             C   sL   t |dr| |d< n0t|}d}||r@|t|d }||d< d S )Ntostringr   z(numpy.record, )hasattrr   r   Zustr
startswithlen)selfr   dataprefixr   r   r   flatten_dtype   s    


zNumpyBaseHandler.flatten_dtypec             C   s&   |d }| drt|}t|S )Nr   ){[)r   astZliteral_evalnpr   )r   r   r   r   r   r   restore_dtype&   s    

zNumpyBaseHandler.restore_dtypeN)__name__
__module____qualname__r!   r&   r   r   r   r   r      s   
r   c               @   s   e Zd Zdd Zdd ZdS )NumpyDTypeHandlerc             C   s   |  || |S )N)r!   )r   objr   r   r   r   flatten.   s    zNumpyDTypeHandler.flattenc             C   s
   |  |S )N)r&   )r   r   r   r   r   restore2   s    zNumpyDTypeHandler.restoreN)r'   r(   r)   r,   r-   r   r   r   r   r*   -   s   r*   c               @   s   e Zd Zdd Zdd ZdS )NumpyGenericHandlerc             C   s0   |  |jd| | jj| dd|d< |S )NNF)resetvalue)r!   r   newbyteordercontextr,   tolist)r   r+   r   r   r   r   r,   7   s    zNumpyGenericHandler.flattenc             C   s$   | j j|d dd}| ||S )Nr1   F)r0   )r3   r-   r&   type)r   r   r1   r   r   r   r-   <   s    zNumpyGenericHandler.restoreN)r'   r(   r)   r,   r-   r   r   r   r   r.   6   s   r.   c                   s(   e Zd ZdZ fddZdd Z  ZS )UnpickleableNumpyGenericHandlerz
    From issue #381, this is used for simplifying the output of numpy arrays
    when unpicklable=False (the default is True).
    c                s2   | j js| j j| ddS tt| ||S d S )NF)r0   )r3   Zunpicklabler,   r4   superr.   )r   r+   r   )	__class__r   r   r,   G   s    z'UnpickleableNumpyGenericHandler.flattenc             C   s   t d S )N)NotImplementedError)r   r   r   r   r   r-   M   s    z'UnpickleableNumpyGenericHandler.restore)r'   r(   r)   __doc__r,   r-   __classcell__r   r   )r8   r   r6   A   s   r6   c               @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )NumpyNDArrayHandlerz>Stores arrays as text representation, without regard for viewsc             C   s   |j jdkrd|d< d S )NF	writeable)flagsr=   )r   r+   r   r   r   r   flatten_flagsT   s    z!NumpyNDArrayHandler.flatten_flagsc             C   s   | ddsd|j_d S )Nr=   TF)getr>   r=   )r   r   r   r   r   r   restore_flagsX   s    z!NumpyNDArrayHandler.restore_flagsc             C   sP   |  |jd| | || | jj| dd|d< d|jkrL|j|d< |S )Nr/   F)r0   valuesr   shape)r!   r   r2   r?   r3   r,   r4   rC   )r   r+   r   r   r   r   r,   \   s    

zNumpyNDArrayHandler.flattenc             C   s`   | j j|d dd}tj|| ||ddd}|dd }|d k	rP||}| || |S )NrB   F)r0   orderC)r   rD   rC   )r3   r-   r%   arrayr&   r@   reshaperA   )r   r   rB   r   rC   r   r   r   r-   f   s    
zNumpyNDArrayHandler.restoreN)r'   r(   r)   r:   r?   rA   r,   r-   r   r   r   r   r<   Q   s
   
r<   c                   sJ   e Zd ZdZdefddZdd Zdd Z fd	d
Z fddZ	  Z
S )NumpyNDArrayHandlerBinaryzstores arrays with size greater than 'size_threshold' as
    (optionally) compressed base64

    Notes
    -----
    This would be easier to implement using np.save/np.load, but
    that would be less language-agnostic
       c             C   s   || _ || _dS )a  
        :param size_threshold: nonnegative int or None
            valid values for 'size_threshold' are all nonnegative
            integers and None
            if size_threshold is None, values are always stored as nested lists
        :param compression: a compression module or None
            valid values for 'compression' are {zlib, bz2, None}
            if compression is None, no compression is applied
        N)size_thresholdcompression)r   rJ   rK   r   r   r   __init__}   s    
z"NumpyNDArrayHandlerBinary.__init__c             C   s    |j j}|dkrt||d< d S )N|r   )r   r   r   )r   r+   r   r   r   r   r   flatten_byteorder   s    z+NumpyNDArrayHandlerBinary.flatten_byteorderc             C   s"   | dd }|r|j||_d S )Nr   )r@   r   r2   )r   r   r   r   r   r   r   restore_byteorder   s    z+NumpyNDArrayHandlerBinary.restore_byteorderc                s   | j dks| j |jkr*tt| ||}n|jtkrHt|	 
 }n$t|dr`|jdd}n|jdd}| jr~| j|}t||d< |j|d< | |jd| | || | || |jjsd|d	< |S )
zencode numpy to jsonNtobytesa)rD   rB   rC   r/   FrD   )rJ   sizer7   rH   r,   r   objectjsondumpsr4   encoder   rP   r   rK   compressr
   rC   r!   r2   rN   r?   r>   c_contiguous)r   r+   r   buf)r8   r   r   r,      s"    


z!NumpyNDArrayHandlerBinary.flattenc                s   |d }t |tr$tt| |}nt |trFtj|g| |d}n| |}t	|}| j
rj| j
|}|tkrt| }tj|||ddd}|dd}|dk	r||}n0tj|||d|ddd }| || | || |S )	zdecode numpy from jsonrB   )r   rD   rE   )r   rD   rC   N)bufferr   rC   rD   )
isinstancelistr7   rH   r-   r   r%   rF   r&   r	   rK   Z
decompressrT   rU   loadsdecoder@   rG   ndarraycopyrO   rA   )r   r   rB   r   r   rZ   rC   )r8   r   r   r-      s.    


z!NumpyNDArrayHandlerBinary.restore)r'   r(   r)   r:   zlibrL   rN   rO   r,   r-   r;   r   r   )r8   r   rH   s   s   *rH   c                   s@   e Zd ZdZddef fdd	Z fddZ fdd	Z  ZS )
NumpyNDArrayHandlerViewa  Pickles references inside ndarrays, or array-views

    Notes
    -----
    The current implementation has some restrictions.

    'base' arrays, or arrays which are viewed by other arrays,
    must be f-or-c-contiguous.
    This is not such a large restriction in practice, because all
    numpy array creation is c-contiguous by default.
    Relaxing this restriction would be nice though; especially if
    it can be done without bloating the design too much.

    Furthermore, ndarrays which are views of array-like objects
    implementing __array_interface__,
    but which are not themselves nd-arrays, are deepcopied with
    a warning (by default),
    as we cannot guarantee whatever custom logic such classes
    implement is correctly reproduced.
    warnrI   c                s   t t| || || _dS )aO  
        :param mode: {'warn', 'raise', 'ignore'}
            How to react when encountering array-like objects whose
            references we cannot safely serialize
        :param size_threshold: nonnegative int or None
            valid values for 'size_threshold' are all nonnegative
            integers and None
            if size_threshold is None, values are always stored as nested lists
        :param compression: a compression module or None
            valid values for 'compression' are {zlib, bz2, None}
            if compression is None, no compression is applied
        N)r7   rc   rL   mode)r   re   rJ   rK   )r8   r   r   rL      s    z NumpyNDArrayHandlerView.__init__c                sl  |j }|dkr<|jjr<tt| ||}|jjs8d|d< n,t|tj	r|jjr| j
j|dd|d< |jj|jj }|r||d< |jjs|j|d< |j|d	< | |jd
| | || t|dkrt|t|krdnd}|r||d< | jdks
| j|jkrhtt| || nJ| jdkr:d}t| n| jdkrRd}t|tt| | |}|S )zencode numpy to jsonNrR   rD   F)r0   baseoffsetstridesrC   r/   rM   Sr   rd   zndarray is defined by reference to an object we do not know how to serialize. A deep copy is serialized instead, breaking memory aliasing.raisezMndarray is defined by reference to an object we do not know how to serialize.)rf   r>   forcr7   rc   r,   rY   r\   r%   r`   r3   Zctypesr   rh   rC   r!   r   r2   r?   r   rJ   rS   rH   re   warningsrd   
ValueErrorra   )r   r+   r   rf   rg   r   msg)r8   r   r   r,     s:    

zNumpyNDArrayHandlerView.flattenc          	      s   | dd}|dkr&tt| |}nl| jj|dd}|jjsFtdtj	|j
| || dd| d| d	d
| ddd}| || |S )zdecode numpy from jsonrf   NF)r0   z8Current implementation assumes base is C or F contiguousr   rM   rC   rg   r   rh   )r[   r   rC   rg   rh   )r@   r7   rc   r-   r3   r>   rk   AssertionErrorr%   r`   r   r&   r2   rA   )r   r   rf   r   )r8   r   r   r-   >  s    

zNumpyNDArrayHandlerView.restore)	r'   r(   r)   r:   rb   rL   r,   r-   r;   r   r   )r8   r   rc      s   6rc   c               C   s   t tjtdd t tjtdd t tjt dd t ttjj	tdd t ttj
j	tdd t ttjj	tdd t ttjj	tdd d S )NT)rf   )r   r%   r   r*   genericr.   r`   rc   voidr8   float32int32
datetime64r   r   r   r   r   X  s    c               C   sj   t tj t tj t tj t ttjj t ttjj t ttjj t ttj	j d S )N)
r   r%   r   rp   r`   rq   r8   rr   rs   rt   r   r   r   r   r   c  s    


) Z
__future__r   r$   rU   sysrl   rb   Znumpyr%    r   r   Zhandlersr   r   r   utilr	   r
   __all__r   r   r   r   r*   r.   r6   r<   rH   rc   r   r   r   r   r   r   <module>   s,   	"ov