o
    �¨ÊhÛ'  ã                	   @  s  d Z ddlm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mZ ddlZddlmZ ddlmZ ed	ƒZed
ƒZG dd„ deeef ƒZ	dd dd„Zd!dd„Zd!dd„ZeejddeeejejdœZd!dd„ZG dd„ dƒZ dS )"z
Module for scope operations
é    )Úannotations)ÚChainMapN)ÚStringIO)ÚTypeVar)Ú	Timestamp)ÚUndefinedVariableErrorÚ_KTÚ_VTc                   @  s$   e Zd ZdZddd	„Zdd
d„ZdS )ÚDeepChainMapz~
    Variant of ChainMap that allows direct updates to inner scopes.

    Only works when all passed mapping are mutable.
    Úkeyr   Úvaluer	   ÚreturnÚNonec                 C  s4   | j D ]}||v r|||<  d S q|| j d |< d S )Nr   )Úmaps)Úselfr   r   Úmapping© r   úO/var/www/html/env/lib/python3.10/site-packages/pandas/core/computation/scope.pyÚ__setitem__!   s   
þzDeepChainMap.__setitem__c                 C  s(   | j D ]}||v r||=  dS qt|ƒ‚)z\
        Raises
        ------
        KeyError
            If `key` doesn't exist.
        N)r   ÚKeyError)r   r   r   r   r   r   Ú__delitem__(   s   
þzDeepChainMap.__delitem__N)r   r   r   r	   r   r   )r   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r
      s    
r
   r   ÚlevelÚintr   ÚScopec                 C  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"   r   r   r   Úensure_scope6   s   ûr#   Ústrc                 C  s0   z	t | ƒ}W t|ƒS  ty   | }Y t|ƒS w )z‚
    Replace a number with its hexadecimal representation. Used to tag
    temporary variables with their calling scope's id.
    )ÚordÚ	TypeErrorÚhex)ÚxÚhexinr   r   r   Ú	_replacerC   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   g | ]}t |ƒ‘qS r   )r*   )Ú.0r(   r   r   r   Ú
<listcomp>W   s    z_raw_hex_id.<locals>.<listcomp>)ÚstructÚpackÚidÚjoin)ÚobjÚpackedr   r   r   Ú_raw_hex_idS   s   r4   TF)r   ÚdatetimeÚTrueÚFalseÚlistÚtupleÚinfÚ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)r2   Úsior   r   r   Ú_get_pretty_stringf   s   r@   c                   @  s°   e Zd ZU dZg d¢Zded< ded< ded< ded	< 	
d*d+dd„Zd,dd„Zed-dd„ƒZ	d.dd„Z
d/d0dd„Zd1d d!„Zd+d"d#„Zd,d$d%„Zed2d&d'„ƒZed3d(d)„ƒZd
S )4r   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   r
   rA   r!   ÚdictrB   Nr   r   r   c           	      C  sô   |d | _ tt ¡ ƒ| _|| _t|tƒr*| j |j¡ |jd ur$|j| _|  	|j ¡ t
 | j ¡}z0| j |d ur:|n|j ¡ ¡}t|ƒ| _t|tƒs^| j |d urS|n|j ¡ ¡}t|ƒ| _W ~n~w t|tƒrp|t|jjƒ7 }t|Ž | _i | _d S )Nr   )r   r
   ÚDEFAULT_GLOBALSÚcopyrA   r"   Ú
isinstancer   ÚupdateÚ_updateÚsysÚ	_getframeÚ	new_childÚ	f_globalsÚf_localsr9   r!   r   rB   )	r   r   r   r    r!   r"   ÚframeÚscope_globalÚscope_localr   r   r   Ú__init__”   s2   


ÿ

ÿ
€


zScope.__init__r$   c                 C  s@   t t| j ¡ ƒƒ}t t| j ¡ ƒƒ}t| ƒj› d|› d|› d�S )Nz(scope=z, resolvers=ú))r@   r8   rA   Úkeysr!   Útyper   )r   Ú
scope_keysÚ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
        )rX   Úlenr!   ©r   r   r   r   Úhas_resolversÁ   s   zScope.has_resolversr   Úis_localc                 C  s‚   z|r	| j | W S | jr| j| W S |s| jrJ ‚| j | W S  ty@   z| j| W  Y S  ty? } zt||ƒ|‚d}~ww w )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
        N)rA   r[   r!   r   rB   r   )r   r   r\   Úerrr   r   r   ÚresolveÏ   s   €ÿúzScope.resolveÚold_keyÚnew_keyc                 C  sP   | j r| jj| jj }n| jj}| | j¡ |D ]}||v r%|||<  dS qd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)r[   r!   r   rA   ÚappendrB   )r   r_   r`   Ú	new_valuer   r   r   r   r   Úswapkeyö   s   þÿzScope.swapkeyÚscopesú	list[str]c                 C  sV   t  ||¡}|D ] \}\}}}}}}zt|d|› �ƒ}t| j |¡ƒ| _W ~q~w 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')
        Úf_N)Ú	itertoolsÚproductÚgetattrr
   rA   rK   )r   Ústackrd   Ú	variablesrA   rN   Ú_Údr   r   r   Ú	_get_vars  s   øzScope._get_varsc              	   C  sJ   |d }t  ¡ }z| j|d|… dgd� W |dd…= ~dS |dd…= ~w )zƒ
        Update the current scope by going back `level` levels.

        Parameters
        ----------
        level : int
        r   NÚlocals)rd   )Úinspectrj   rn   )r   r   Úslrj   r   r   r   rH   &  s
   zScope._updatec                 C  sJ   t |ƒj› d| j› dt| ƒ› �}|| jvsJ ‚|| j|< || jv s#J ‚|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.
        rl   )rT   r   Úntempsr4   rB   )r   r   Únamer   r   r   Úadd_tmp:  s
    
zScope.add_tmpc                 C  s
   t | jƒS )z/The number of temporary variables in this scope)rY   rB   rZ   r   r   r   rr   R  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.
        )rB   r!   r   rA   r
   )r   r   r   r   r   Ú
full_scopeW  s   zScope.full_scope©NNr   N)r   r   r   r   ©r   r$   )r   rX   )r   r$   r\   rX   )N)r_   r$   r`   r$   r   r   )rd   re   r   r   )r   r   )r   r
   )r   r   r   r   Ú	__slots__Ú__annotations__rQ   rW   Úpropertyr[   r^   rc   rn   rH   rt   rr   ru   r   r   r   r   r   y   s*   
 ÿ
(
'


rv   )r   r   r   r   rw   )!r   Ú
__future__r   Úcollectionsr   r5   rp   Úior   rg   r=   r.   rI   Útypingr   ÚnumpyÚnpÚpandas._libs.tslibsr   Úpandas.errorsr   r   r	   r
   r#   r*   r4   r8   r9   r:   rD   r@   r   r   r   r   r   Ú<module>   s@    ÿ

ø
