B
    Afxa-                 @  s   d Z ddlm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 dd	lmZ dd
lmZ ddlmZmZ ddlmZmZmZ e	rddlmZ G dd deeZ e Z!ddddZ"dS )z
    pint.unit
    ~~~~~~~~~

    Functions and classes related to unit definitions and conversions.

    :copyright: 2016 by Pint Authors, see AUTHORS for more details.
    :license: BSD, see LICENSE for more details.
    )annotationsN)Number)TYPE_CHECKINGAnyTypeUnion   )UnitLike)NUMERIC_TYPESbabel_parseis_upcast_type)UnitDefinition)DimensionalityError)extract_custom_flagsformat_unit)PrettyIPythonSharedRegistryObjectUnitsContainer)Contextc                  s  e Zd ZU dZdZded< dd Zddd	 fd
dZeddddZ	d dddZ
d dddZddddZddddZddddZddddZdWddddd Zed!dd"d#Zed$dd%d&Zd'd( Zdd)dd!d*d+d,Zd-d. ZeZd/d0 Zd1d2 ZeZeZd3dd4d5Zd6dd7d8Zd!dd9d:Zd!dd;d<Zd!dd=d>Zd?d@ Z dAd@ Z!dBd@ Z"dCd@ Z#d6ddDdEZ$dFddGdHZ%dIddJdKZ&dLZ'dMdN Z(edOdP Z)dXdSdTZ*dYdUdVZ+  Z,S )ZUnitzAImplements a class to describe a unit supporting math operations. strdefault_formatc             C  s   ddl m} |t| jffS )Nr   )_unpickle_unit)r   r   r   _units)selfr    r   (lib/python3.7/site-packages/pint/unit.py
__reduce__$   s    zUnit.__reduce__r	   None)unitsreturnc               sr   t    t|ttfr || _nBt|tr<| j|j| _n&t|t	rP|j| _nt
dt|d| _d | _d S )Nz:units must be of type str, Unit or UnitsContainer; not {}.F)super__init__
isinstancer   r   r   r   	_REGISTRYparse_unitsr   	TypeErrorformattype_Unit__usedZ_Unit__handling)r   r    )	__class__r   r   r#   *   s    



zUnit.__init__r   )r!   c             C  s   | j S )N)r*   )r   r   r   r   
debug_used;   s    zUnit.debug_usedc             C  s   |  | j}| j|_|S )N)r+   r   r*   )r   retr   r   r   __copy__?   s    zUnit.__copy__c             C  s    |  t| j|}| j|_|S )N)r+   copydeepcopyr   r*   )r   memor-   r   r   r   __deepcopy__D   s    zUnit.__deepcopy__c             C  s   t | S )N)r(   )r   r   r   r   __str__I   s    zUnit.__str__bytesc             C  s   t | t S )N)r   encodelocalegetpreferredencoding)r   r   r   r   	__bytes__L   s    zUnit.__bytes__c             C  s   d | jS )Nz<Unit('{}')>)r(   r   )r   r   r   r   __repr__O   s    zUnit.__repr__c               sd   |pt  j}d|krN js dS tt fdd j D }|dd}n j}t|| jdS )N~r   c             3  s"   | ]\}} j ||fV  qd S )N)r%   _get_symbol).0keyvalue)r   r   r   	<genexpr>Y   s   z"Unit.__format__.<locals>.<genexpr>)registry)	r   r   r   r   dictitemsreplacer   r%   )r   specr    r   )r   r   
__format__R   s    
zUnit.__format__N)kwspecr!   c               s   |pt  j}d|krN jr dS tt fdd j D }|dd}n j}|d krd jj	n|}|d krzt
dnt||d< |j|fd ji|S )Nr:   r   c             3  s"   | ]\}} j ||fV  qd S )N)r%   r;   )r<   r=   r>   )r   r   r   r?   k   s   z$Unit.format_babel.<locals>.<genexpr>z1Provide a `locale` value to localize translation.r6   r@   )r   r   dimensionlessr   rA   r   rB   rC   r%   Z
fmt_locale
ValueErrorr   format_babel)r   rD   r6   rF   r    r   )r   r   rI   c   s    

zUnit.format_babelboolc             C  s   t | j S )z:Return True if the Unit is dimensionless; False otherwise.)rJ   dimensionality)r   r   r   r   rG   |   s    zUnit.dimensionlessr   c             C  s6   y| j S  tk
r.   | j| j}|| _ Y nX | j S )z}
        Returns
        -------
        dict
            Dimensionality of the Unit, e.g. ``{length: 1, time: -1}``
        )Z_dimensionalityAttributeErrorr%   Z_get_dimensionalityr   )r   Zdimr   r   r   rK      s    zUnit.dimensionalityc          	   G  s0   |r$| j j|  | j | S Q R X | j | S )N)r%   contextZget_compatible_units)r   contextsr   r   r   compatible_units   s    zUnit.compatible_unitszUnion[str, Context])otherrN   
ctx_kwargsr!   c             O  sz   |r4yd|  j |f|| dS  tk
r2   dS X t|| jj| jjfrV| j|jkS t|trt| j| j|jkS | j	S )a  check if the other object is compatible

        Parameters
        ----------
        other
            The object to check. Treated as dimensionless if not a
            Quantity, Unit or str.
        *contexts : str or pint.Context
            Contexts to use in the transformation.
        **ctx_kwargs :
            Values for the Context/s

        Returns
        -------
        bool
        r   TF)
tor   r$   r%   Quantityr   rK   r   r&   rG   )r   rP   rN   rQ   r   r   r   is_compatible_with   s    
zUnit.is_compatible_withc             C  sv   |  |r@t|| jr(| | j|j S | jd| j}|| S t|trb|dkrb| j|| jS | jd| j| S )Nr   )_checkr$   r+   r   r%   rS   r   )r   rP   qselfr   r   r   __mul__   s    
zUnit.__mul__c             C  sL   |  |r8t|| jr(| | j|j S d|  }|| S | jd| | jS )Nr   )rU   r$   r+   r   r%   rS   )r   rP   rV   r   r   r   __truediv__   s    
zUnit.__truediv__c             C  s@   t |tr| j|d| j S t |tr8| || j S tS d S )Nr   )r$   r
   r%   rS   r   r   r+   NotImplemented)r   rP   r   r   r   __rtruediv__   s
    

zUnit.__rtruediv__z'Unit'c             C  s4   t |tr| | j| S dt|}t|d S )NzCannot power Unit by {})r$   r
   r+   r   r(   r)   r'   )r   rP   Zmessr   r   r   __pow__   s    
zUnit.__pow__intc             C  s
   | j  S )N)r   __hash__)r   r   r   r   r]      s    zUnit.__hash__c             C  sd   |  |r8t|| jr"| j|jkS || jd| jkS n(t|trV|| jd| jkS | j|kS d S )Nr   )rU   r$   r+   r   r%   rS   r
   )r   rP   r   r   r   __eq__   s    

zUnit.__eq__c             C  s
   | |k S )Nr   )r   rP   r   r   r   __ne__   s    zUnit.__ne__c             C  sR   | j d| }t|tr$|||S t|tttfrJ|| j d||S tS d S )Nr   )	r%   rS   r$   r
   comparer   r   rA   rY   )r   rP   opZself_qr   r   r   r`      s    
zUnit.comparec             C  s   | j |tjdS )N)ra   )r`   operatorlt)r   rP   r   r   r   <lambda>	      zUnit.<lambda>c             C  s   | j |tjdS )N)ra   )r`   rb   le)r   rP   r   r   r   rd   
  re   c             C  s   | j |tjdS )N)ra   )r`   rb   ge)r   rP   r   r   r   rd     re   c             C  s   | j |tjdS )N)ra   )r`   rb   gt)r   rP   r   r   r   rd     re   c             C  s   t | jd| jS )Nr   )r\   r%   rS   r   )r   r   r   r   __int__  s    zUnit.__int__floatc             C  s   t | jd| jS )Nr   )rj   r%   rS   r   )r   r   r   r   	__float__  s    zUnit.__float__complexc             C  s   t | jd| jS )Nr   )rl   r%   rS   r   )r   r   r   r   __complex__  s    zUnit.__complex__   c               sr   |dkrt S tdd t|t|  D }tdd |D rDt S |jdkrj|t fdd|D |S t S d S )N__call__c             s  s    | ]}t |d rt|V  qdS )__array_ufunc__N)hasattrr)   )r<   argr   r   r   r?      s   z'Unit.__array_ufunc__.<locals>.<genexpr>c             s  s   | ]}t |V  qd S )N)r   )r<   rP   r   r   r   r?   $  s    )Ztrue_divideZdivideZfloor_divideZmultiplyc             3  s*   | ]"}| kr j d  jn|V  qdS )r   N)r%   rS   r   )r<   rr   )r   r   r   r?   ,  s   )rY   setlistvaluesany__name__tuple)r   ZufuncmethodZinputskwargstypesr   )r   r   rp     s    

zUnit.__array_ufunc__c             C  sP   t  }x@| j D ]2}x,| jj D ]\}}||jkr$|| q$W qW t|S )N)	rs   r   keysr%   Z_systemsrB   membersadd	frozenset)r   outunameZsnamesysr   r   r   systems4  s    
zUnit.systemsTr>   c             C  sN   |  |r0t|| jjs&| jd|}|| S |rBtd| n||  S dS )a  Converts a numerical value or quantity to this unit

        Parameters
        ----------
        value :
            a Quantity (or numerical value if strict=False) to convert
        strict :
            boolean to indicate that only quantities are accepted (Default value = True)
        name :
            descriptive name to use if an exception occurs (Default value = "value")

        Returns
        -------
        type
            The converted value as this unit

        r   z%s must be a QuantityN)rU   r$   r%   rS   rR   rH   )r   r>   strictnamer   r   r   from_=  s    

z
Unit.from_c             C  s   | j |||djS )a#  Converts a numerical value or quantity to this unit, then returns
        the magnitude of the converted value

        Parameters
        ----------
        value :
            a Quantity (or numerical value if strict=False) to convert
        strict :
            boolean to indicate that only quantities are accepted (Default value = True)
        name :
            descriptive name to use if an exception occurs (Default value = "value")

        Returns
        -------
        type
            The magnitude of the converted value

        )r   r   )r   Z	magnitude)r   r>   r   r   r   r   r   m_fromX  s    zUnit.m_from)r   N)Tr>   )Tr>   )-rw   
__module____qualname____doc__r   __annotations__r   r#   propertyr,   r.   r2   r3   r8   r9   rE   rI   rG   rK   rO   rT   rW   __rmul__rX   rZ   Z__div__Z__rdiv__r[   r]   r^   r_   r`   __lt____le____ge____gt__ri   rk   rm   Z__array_priority__rp   r   r   r   __classcell__r   r   )r+   r   r      sN   
$


	
r   z
Type[Unit])r!   c               s   G  fdddt }|S )Nc                  s   e Zd Z ZdS )zbuild_unit_class.<locals>.UnitN)rw   r   r   r%   r   )r@   r   r   r   r  s   r   )_Unit)r@   r   r   )r@   r   build_unit_classq  s    r   )#r   Z
__future__r   r/   r6   rb   Znumbersr   typingr   r   r   r   Z_typingr	   compatr
   r   r   Zdefinitionsr   errorsr   Z
formattingr   r   utilr   r   r   rM   r   r   r   r   r   r   r   r   <module>	   s&     R