U
    Cvf                     @  sf   d dl mZ d dlZd dlmZ d dlmZ G dd deZG dd dZ	d	d
 Z
dd Zdd ZdS )    )annotationsN)	DataArray)Datasetc                   @  s   e Zd ZdZdS )AccessorRegistrationWarningz/Warning for conflicts in accessor registration.N)__name__
__module____qualname____doc__ r
   r
   :/tmp/pip-unpacked-wheel-h316xyqg/xarray/core/extensions.pyr   	   s   r   c                   @  s    e Zd ZdZdd Zdd ZdS )_CachedAccessorz?Custom property-like object (descriptor) for caching accessors.c                 C  s   || _ || _d S )N)_name	_accessor)selfnameaccessorr
   r
   r   __init__   s    z_CachedAccessor.__init__c                 C  s   |d kr| j S z
|j}W n tk
r6   i  }|_Y nX z|| j W S  tk
rX   Y nX z|  |}W n& tk
r   td| jdY nX ||| j< |S )Nzerror initializing z
 accessor.)r   _cacheAttributeErrorr   KeyErrorRuntimeError)r   objclscacheZaccessor_objr
   r
   r   __get__   s     

z_CachedAccessor.__get__N)r   r   r   r	   r   r   r
   r
   r
   r   r      s   r   c                   s    fdd}|S )Nc                   sD   t  r.tjd| dd dtdd t t|  | S )Nzregistration of accessor z under name z
 for type z: is overriding a preexisting attribute with the same name.   )
stacklevel)hasattrwarningswarnr   setattrr   )r   r   r   r
   r   	decorator2   s    
z%_register_accessor.<locals>.decoratorr
   )r   r   r"   r
   r!   r   _register_accessor1   s    r#   c                 C  s
   t | tS )a0  Register a custom accessor on xarray.DataArray objects.

    Parameters
    ----------
    name : str
        Name under which the accessor should be registered. A warning is issued
        if this name conflicts with a preexisting attribute.

    See Also
    --------
    register_dataset_accessor
    )r#   r   r   r
   r
   r   register_dataarray_accessor@   s    r%   c                 C  s
   t | tS )a  Register a custom property on xarray.Dataset objects.

    Parameters
    ----------
    name : str
        Name under which the accessor should be registered. A warning is issued
        if this name conflicts with a preexisting attribute.

    Examples
    --------
    In your library code:

    >>> @xr.register_dataset_accessor("geo")
    ... class GeoAccessor:
    ...     def __init__(self, xarray_obj):
    ...         self._obj = xarray_obj
    ...
    ...     @property
    ...     def center(self):
    ...         # return the geographic center point of this dataset
    ...         lon = self._obj.latitude
    ...         lat = self._obj.longitude
    ...         return (float(lon.mean()), float(lat.mean()))
    ...
    ...     def plot(self):
    ...         # plot this array's data on a map, e.g., using Cartopy
    ...         pass
    ...

    Back in an interactive IPython session:

    >>> ds = xr.Dataset(
    ...     {"longitude": np.linspace(0, 10), "latitude": np.linspace(0, 20)}
    ... )
    >>> ds.geo.center
    (10.0, 5.0)
    >>> ds.geo.plot()  # plots data on a map

    See Also
    --------
    register_dataarray_accessor
    )r#   r   r$   r
   r
   r   register_dataset_accessorP   s    +r&   )
__future__r   r   Zxarray.core.dataarrayr   Zxarray.core.datasetr   Warningr   r   r#   r%   r&   r
   r
   r
   r   <module>   s   $