U
    f/e/(                  	   @  s   d Z ddlmZ ddlZddlZ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mZ ddlmZ ddd	d
ddZddddZddddZeejddeeejejdZddddZG dd	 d	ZdS )z
Module for scope operations
    )annotationsN)StringIO)	Timestamp)DeepChainMap intScopelevelreturnc                 K  s   t | d ||||dS )z.Ensure that we are grabbing the correct scope.   )global_dict
local_dict	resolverstarget)r   )r
   r   r   r   r   kwargsr   r   A/tmp/pip-unpacked-wheel-tiezk1ph/pandas/core/computation/scope.pyensure_scope   s    r   strr   c                 C  s.   zt | }W n tk
r$   | }Y nX t|S )z
    Replace a number with its hexadecimal representation. Used to tag
    temporary variables with their calling scope's id.
    )ord	TypeErrorhex)xZhexinr   r   r   	_replacer!   s
    
r   c                 C  s$   t dt| }ddd |D S )z,Return the padded hexadecimal id of ``obj``.z@P c                 s  s   | ]}t |V  qd S )N)r   ).0r   r   r   r   	<genexpr>5   s     z_raw_hex_id.<locals>.<genexpr>)structpackidjoin)objpackedr   r   r   _raw_hex_id1   s    r$   TF)r   datetimeTrueFalselisttupleinfZInfc                 C  s   t  }tj| |d | S )z
    Return a prettier version of obj.

    Parameters
    ----------
    obj : object
        Object to pretty print

    Returns
    -------
    str
        Pretty print object repr
    )stream)r   pprintgetvalue)r"   sior   r   r   _get_pretty_stringD   s    r/   c                   @  s   e Zd ZU dZdddddgZded< ded< ded< d	ed< d*ddddZddddZeddddZ	dddddZ
d+ddddddZddddd Zddd!d"d#Zddd$d%Zeddd&d'Zeddd(d)Zd
S ),r   a  
    Object to hold scope, with a few bells to deal with some custom syntax
    and contexts added by pandas.

    Parameters
    ----------
    level : int
    global_dict : dict or None, optional, default None
    local_dict : dict or Scope or None, optional, default None
    resolvers : list-like or None, optional, default None
    target : object

    Attributes
    ----------
    level : int
    scope : DeepChainMap
    target : object
    temps : dict
    r
   scoper   r   tempsr   r   dictNr   )r
   c                 C  s   |d | _ tt | _|| _t|trT| j|j |jd k	rH|j| _| 	|j  t
| j }z>| j|pp|j | _t|ts| j|p|j | _W 5 ~X t|tr|t|jj7 }t| | _i | _d S )Nr   )r
   r   DEFAULT_GLOBALScopyr0   r   
isinstancer   update_updatesys	_getframe	new_child	f_globalsf_localsr)   r   mapsr1   )selfr
   r   r   r   r   framer   r   r   __init__r   s,    






zScope.__init__r   r   c                 C  s@   t t| j }t t| j }t| j d| d| dS )Nz(scope=z, resolvers=))r/   r(   r0   keysr   type__name__)r>   Z
scope_keysZres_keysr   r   r   __repr__   s    zScope.__repr__boolc                 C  s   t t| jS )z
        Return whether we have any extra scope.

        For example, DataFrames pass Their columns as resolvers during calls to
        ``DataFrame.eval()`` and ``DataFrame.query()``.

        Returns
        -------
        hr : bool
        )rF   lenr   r>   r   r   r   has_resolvers   s    zScope.has_resolvers)keyis_localc                 C  s   z<|r| j | W S | jr$| j| W S |s.| jr2t| j | W S  tk
r   z| j| W  Y S  tk
r } zddlm} ||||W 5 d}~X Y nX Y nX dS )a  
        Resolve a variable name in a possibly local context.

        Parameters
        ----------
        key : str
            A variable name
        is_local : bool
            Flag indicating whether the variable is local or not (prefixed with
            the '@' symbol)

        Returns
        -------
        value : object
            The value of a particular variable
        r   )UndefinedVariableErrorN)r0   rI   r   AssertionErrorKeyErrorr1   Zpandas.core.computation.opsrL   )r>   rJ   rK   errrL   r   r   r   resolve   s    zScope.resolveNone)old_keynew_keyr   c                 C  sP   | j r| jj| jj }n| jj}|| j |D ]}||kr0|||<  dS q0dS )a]  
        Replace a variable name, with a potentially new value.

        Parameters
        ----------
        old_key : str
            Current variable name to replace
        new_key : str
            New variable name to replace `old_key` with
        new_value : object
            Value to be replaced along with the possible renaming
        N)rI   r   r=   r0   appendr1   )r>   rR   rS   	new_valuer=   mappingr   r   r   swapkey   s    zScope.swapkeyz	list[str])scopesr   c                 C  sP   t ||}|D ]:\}\}}}}}}z t|d| }| j|| _W 5 ~X qdS )a  
        Get specifically scoped variables from a list of stack frames.

        Parameters
        ----------
        stack : list
            A list of stack frames as returned by ``inspect.stack()``
        scopes : sequence of strings
            A sequence containing valid stack frame attribute names that
            evaluate to a dictionary. For example, ('locals', 'globals')
        Zf_N)	itertoolsproductgetattrr0   r:   )r>   stackrX   	variablesr0   r?   _dr   r   r   	_get_vars   s    zScope._get_varsr	   c              	   C  s@   |d }t  }z| j|d| dgd W 5 |dd= ~X dS )z
        Update the current scope by going back `level` levels.

        Parameters
        ----------
        level : int
        r   Nlocals)rX   )inspectr\   r`   )r>   r
   slr\   r   r   r   r7     s
    zScope._updatec                 C  sJ   t |j d| j dt|  }|| jks.t|| j|< || jksFt|S )a#  
        Add a temporary variable to the scope.

        Parameters
        ----------
        value : object
            An arbitrary object to be assigned to a temporary variable.

        Returns
        -------
        str
            The name of the temporary variable created.
        r^   )rC   rD   ntempsr$   r1   rM   )r>   valuenamer   r   r   add_tmp!  s
     
zScope.add_tmpc                 C  s
   t | jS )z/The number of temporary variables in this scope)rG   r1   rH   r   r   r   rd   9  s    zScope.ntempsc                 C  s    | j g| jj | jj }t| S )z
        Return the full scope for use with passing to engines transparently
        as a mapping.

        Returns
        -------
        vars : DeepChainMap
            All variables in this scope.
        )r1   r   r=   r0   r   )r>   r=   r   r   r   
full_scope>  s    zScope.full_scope)NNr   N)N)rD   
__module____qualname____doc__	__slots____annotations__r@   rE   propertyrI   rP   rW   r`   r7   rg   rd   rh   r   r   r   r   r   W   s.   
       +*)NNr   N)rk   
__future__r   r%   rb   ior   rY   r,   r   r8   ZnumpynpZpandas._libs.tslibsr   Zpandas.compat.chainmapr   r   r   r$   r(   r)   r*   r3   r/   r   r   r   r   r   <module>   s:          