a
    GGb                     @  s   U d Z ddlmZ ddlZddlmZmZ ddlmZ ddl	m
Z
mZ ddlm  m  mZ ee
e ZG dd deZd	d
dddZG dd dejdZG dd deZG dd deZeedZded< dS )z)
Engine classes for :func:`~pandas.eval`
    )annotationsN)align_termsreconstruct_object)Expr)MATHOPS
REDUCTIONSc                   @  s   e Zd ZdS )NumExprClobberingErrorN)__name__
__module____qualname__ r   r   >lib/python3.9/site-packages/pandas/core/computation/engines.pyr      s   r   r   None)exprreturnc                 C  s@   | j }|t@ }|r<ddd |D }td|  d| ddS )z
    Attempt to prevent foot-shooting in a helpful way.

    Parameters
    ----------
    expr : Expr
        Terms can contain
    z, c                 S  s   g | ]}t |qS r   )repr).0xr   r   r   
<listcomp>(       z+_check_ne_builtin_clash.<locals>.<listcomp>zVariables in expression "z" overlap with builtins: ()N)names_ne_builtinsjoinr   )r   r   Zoverlapsr   r   r   _check_ne_builtin_clash   s    	r   c                   @  sX   e Zd ZdZdZdd ZddddZd	dd
dZeddddZ	e
jdd ZdS )AbstractEnginez/Object serving as a base class for all engines.Fc                 C  s   || _ d | _d | _d S N)r   aligned_axesresult_type)selfr   r   r   r   __init__3   s    zAbstractEngine.__init__strr   c                 C  s   t | jS )zo
        Convert an expression for evaluation.

        Defaults to return the expression as a string.
        )printingZpprint_thingr   r    r   r   r   convert8   s    zAbstractEngine.convertobjectc                 C  s:   | j st| jj\| _| _|  }t| j|| j| jjjS )a*  
        Run the engine on the expression.

        This method performs alignment which is necessary no matter what engine
        is being used, thus its implementation is in the base class.

        Returns
        -------
        object
            The result of the passed expression.
        )	_is_alignedr   r   Ztermsr   r   	_evaluater   Zreturn_type)r    resr   r   r   evaluate@   s    zAbstractEngine.evaluateboolc                 C  s   | j d uo| jd uS r   )r   r   r%   r   r   r   r(   U   s    zAbstractEngine._is_alignedc                 C  s   dS )a  
        Return an evaluated expression.

        Parameters
        ----------
        env : Scope
            The local and global environment in which to evaluate an
            expression.

        Notes
        -----
        Must be implemented by subclasses.
        Nr   r%   r   r   r   r)   Y   s    zAbstractEngine._evaluateN)r	   r
   r   __doc__has_neg_fracr!   r&   r+   propertyr(   abcabstractmethodr)   r   r   r   r   r   .   s   r   )	metaclassc                   @  s   e Zd ZdZdZdd ZdS )NumExprEnginezNumExpr engine classTc                 C  s6   dd l }|  }| jj}|j}t| j |j||dS )Nr   )Z
local_dict)numexprr&   r   envZ
full_scoper   r+   )r    ner   r5   Zscoper   r   r   r)   p   s    
zNumExprEngine._evaluateN)r	   r
   r   r-   r.   r)   r   r   r   r   r3   k   s   r3   c                   @  s*   e Zd ZdZdZdd ZddddZd	S )
PythonEnginezS
    Evaluate an expression in Python space.

    Mostly for testing purposes.
    Fc                 C  s   |   S r   )r   r%   r   r   r   r+      s    zPythonEngine.evaluater   r#   c                 C  s   d S r   r   r%   r   r   r   r)      s    zPythonEngine._evaluateN)r	   r
   r   r-   r.   r+   r)   r   r   r   r   r7   |   s   r7   )r4   Zpythonzdict[str, type[AbstractEngine]]ENGINES)r-   Z
__future__r   r0   Zpandas.core.computation.alignr   r   Zpandas.core.computation.exprr   Zpandas.core.computation.opsr   r   Zpandas.io.formats.printingioZformatsr$   	frozensetr   	NameErrorr   r   ABCMetar   r3   r7   r8   __annotations__r   r   r   r   <module>   s   =