a
    İa$                     @   s(  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m	Z	m
Z
mZ ddlmZ ddlmZmZmZmZmZ ddlmZmZ dd	lmZmZ dd
lmZmZmZ ddlmZ zd dl Z!dZ"W n e#y   dZ"Y n0 dd Z$dd Z%G dd deZ&dd Z'G dd deZ(G dd deZ)e)ed< dS )    N   )NumpyIndexingAdapter)Frozen
FrozenDictclose_on_error'try_read_magic_number_from_file_or_path)Variable   )BACKEND_ENTRYPOINTSBackendArrayBackendEntrypointWritableCFDataStore_normalize_path)CachingFileManagerDummyFileManager)ensure_lockget_write_lock)encode_nc3_attr_valueencode_nc3_variableis_valid_nc3_name)StoreBackendEntrypointTFc                 C   s   t | tr| ddS | S )Nzutf-8replace)
isinstancebytesdecode)s r   5lib/python3.9/site-packages/xarray/backends/scipy_.py_decode_string#   s    
r   c                 C   s   dd |   D S )Nc                 S   s&   i | ]\}}||d kr|nt |qS )
_FillValue)r   .0kvr   r   r   
<dictcomp>,       z!_decode_attrs.<locals>.<dictcomp>)items)dr   r   r   _decode_attrs)   s    r(   c                   @   s.   e Zd Zdd ZdddZdd Zdd	 Zd
S )ScipyArrayWrapperc                 C   s>   || _ || _|  j}|j| _t|jjt|jj	 | _d S N)
	datastorevariable_nameget_variabledatashapenpdtypekindstritemsize)selfr,   r+   arrayr   r   r   __init__0   s
    
zScipyArrayWrapper.__init__Tc                 C   s   | j j|}|j| j S r*   )r+   _manageracquire	variablesr,   )r5   
needs_lockdsr   r   r   r-   7   s    zScipyArrayWrapper.get_variablec                 C   s.   t |  j| }| jjj}tj|| j|dS )N)r1   copy)	r   r-   r.   r+   r<   Zuse_mmapr0   r6   r1   )r5   keyr.   r=   r   r   r   __getitem__;   s    
zScipyArrayWrapper.__getitem__c              	   C   sp   | j jT | jdd}z|||< W n* tyL   |tu rF||d d < n Y n0 W d    n1 sb0    Y  d S )NF)r;   )r+   lockr-   	TypeErrorEllipsis)r5   r>   valuer.   r   r   r   __setitem__C   s    
zScipyArrayWrapper.__setitem__N)T)__name__
__module____qualname__r7   r-   r?   rD   r   r   r   r   r)   /   s   
r)   c              
   C   s   t | trl| drlztjjt| |||dW S  tyj } z"d|j	v rTt
dn W Y d }~n
d }~0 0 t | tr| drt| } ztjj| |||dW S  ty } z6|jd }d|v rd}||7 }t|n W Y d }~n
d }~0 0 d S )N.gzmodemmapversionzis not a valid NetCDF 3 filez2gzipped file loading only supports NetCDF 3 files.   CDFr   z
            If this is a NetCDF4 file, you may need to install the
            netcdf4 library, e.g.,

            $ pip install netcdf4
            )r   r3   endswithscipyioZnetcdf_filegzipopenrA   message
ValueErrorr   
startswithBytesIOargs)filenamerJ   rK   rL   eerrmsgmsgr   r   r   _open_scipy_netcdfP   s(    




r\   c                   @   s   e Zd ZdZd!ddZedd Zdd	 Zd
d Zdd Z	dd Z
dd Zd"ddZdd Zdd Zdd Zd#ddZdd Zdd  ZdS )$ScipyDataStorezStore for reading and writing data via scipy.io.netcdf.

    This store has the advantage of being able to be initialized with a
    StringIO object, allow for serialization without writing to disk.

    It only supports the NetCDF3 file-format.
    rNc           
   	   C   s   |d urt d|d u s |dkr&d}n|dkr4d}nt d||d u rd|dkrdt|trdt|}t|| _t|trtt|||t||dd	}nt||||d
}	t	|	}|| _
d S )Nz7cannot save to a group with the scipy.io.netcdf backendZNETCDF3_64BITr   ZNETCDF3_CLASSICr	   z,invalid format for scipy.io.netcdf backend: r^   )rK   rL   )rJ   r@   kwargsrI   )rT   r   r3   r   r   r@   r   r\   dictr   r8   )
r5   filename_or_objrJ   formatgrouprK   r@   rL   ZmanagerZscipy_datasetr   r   r   r7   |   s.    


zScipyDataStore.__init__c                 C   s
   | j  S r*   )r8   r9   r5   r   r   r   r<      s    zScipyDataStore.dsc                 C   s   t |jt|| t|jS r*   )r   
dimensionsr)   r(   _attributes)r5   namevarr   r   r   open_store_variable   s
    z"ScipyDataStore.open_store_variablec                    s   t  fdd jj D S )Nc                 3   s"   | ]\}}|  ||fV  qd S r*   )ri   r    rd   r   r   	<genexpr>   s   z/ScipyDataStore.get_variables.<locals>.<genexpr>)r   r<   r:   r&   rd   r   rd   r   get_variables   s    
zScipyDataStore.get_variablesc                 C   s   t t| jjS r*   )r   r(   r<   rf   rd   r   r   r   	get_attrs   s    zScipyDataStore.get_attrsc                 C   s   t | jjS r*   )r   r<   re   rd   r   r   r   get_dimensions   s    zScipyDataStore.get_dimensionsc                 C   s   ddd | j j D iS )Nunlimited_dimsc                 S   s   h | ]\}}|d u r|qS r*   r   r    r   r   r   	<setcomp>   r%   z.ScipyDataStore.get_encoding.<locals>.<setcomp>)r<   re   r&   rd   r   r   r   get_encoding   s    zScipyDataStore.get_encodingFc                 C   s>   || j jv r tt| j d|s(|nd }| j || d S )Nz& does not support modifying dimensions)r<   re   rT   typerE   ZcreateDimension)r5   rg   lengthZis_unlimitedZ
dim_lengthr   r   r   set_dimension   s    zScipyDataStore.set_dimensionc                 C   s   t |stdd S )NzNot a valid attribute name)r   rT   )r5   r>   r   r   r   _validate_attr_key   s    z!ScipyDataStore._validate_attr_keyc                 C   s$   |  | t|}t| j|| d S r*   )rt   r   setattrr<   )r5   r>   rC   r   r   r   set_attribute   s    
zScipyDataStore.set_attributec                 C   s   t |}|S r*   )r   )r5   variabler   r   r   encode_variable   s    zScipyDataStore.encode_variablec           
      C   s   |r,|j r,|j dd ikr,tdt|j  |j}|| jjvrR| j||j|j | jj| }|j	
 D ]\}}| | t||| qht|| }	|	|fS )Nr   z'unexpected encoding for scipy backend: )encodingrT   listr.   r<   r:   ZcreateVariabler1   Zdimsattrsr&   rt   ru   r)   )
r5   rg   rw   Zcheck_encodingrn   r.   Z	scipy_varr"   r#   targetr   r   r   prepare_variable   s$    

zScipyDataStore.prepare_variablec                 C   s   | j   d S r*   )r<   syncrd   r   r   r   r~      s    zScipyDataStore.syncc                 C   s   | j   d S r*   )r8   closerd   r   r   r   r      s    zScipyDataStore.close)r^   NNNN)F)FN)rE   rF   rG   __doc__r7   propertyr<   ri   rk   rl   rm   rp   rs   rt   rv   rx   r}   r~   r   r   r   r   r   r]   s   s$   	 
"

 
r]   c                   @   s"   e Zd ZeZdd ZdddZdS )	ScipyBackendEntrypointc                 C   s   t |}|d urL|drLt|}t |}W d    n1 sB0    Y  |d ur^|dS ztj|\}}W n ty   Y dS 0 |dv S )Ns   rM   F>   z.nc4z.cdfrH   z.nc)r   rU   rQ   rR   ospathsplitextrA   )r5   ra   Zmagic_numberf_extr   r   r   guess_can_open   s    &
z%ScipyBackendEntrypoint.guess_can_openTNr^   c                 C   sh   t |}t||	|
|||d}t }t|* |j||||||||d}W d    n1 sZ0    Y  |S )N)rJ   rb   rc   rK   r@   )mask_and_scaledecode_timesconcat_charactersdecode_coordsdrop_variables
use_cftimedecode_timedelta)r   r]   r   r   open_dataset)r5   ra   r   r   r   r   r   r   r   rJ   rb   rc   rK   r@   storeZstore_entrypointr<   r   r   r   r     s"    
$
z#ScipyBackendEntrypoint.open_dataset)TTTTNNNr^   NNNN)rE   rF   rG   	has_scipyZ	availabler   r   r   r   r   r   r      s               r   rO   )*rQ   rP   r   Znumpyr0   Zcore.indexingr   Z
core.utilsr   r   r   r   Zcore.variabler   commonr
   r   r   r   r   Zfile_managerr   r   locksr   r   Znetcdf3r   r   r   r   r   Zscipy.iorO   r   ModuleNotFoundErrorr   r(   r)   r\   r]   r   r   r   r   r   <module>   s.   
!#}7