o
    ôT·jµb  ã                   @  sN  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	Z	ddl
mZmZmZ ddlZddlmZ ddlmZ ddlm  mZ dd	lmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& dd
l'm(Z(m)Z) ddl*m+Z+ ddl,m-Z- dDdd„Z.dDdd„Z/dDdd„Z0dd„ Z1dd„ Z2e2e0e/e.e(ƒfdEdd„Z3dd„ Z4e4e5ƒZ6e4e7ƒZ8e9d d!„ d"d!„ e:eƒD ƒD ƒƒZ;e;fd#d$„Z<e9d%d!„ e;D ƒƒZ=e<ej>ƒZ?e<ej@ƒZAe<ejBƒZCe<ejDƒZEe<ejFƒZGe<ejHƒZIe<ejJƒZKe<ejLƒZMe<ejNƒZOe<ejPƒZQe<ejRƒZSe<ejƒZTe<ejUƒZVe9g d&¢ƒZWe9g d'¢ƒZXeAe?B eQB eSB eTB eVB eEB eXB eW ZYe=eY eWB ZZeYeZ@ Z[d(e[› �Z\e[�r8J e\ƒ‚dFd+d,„Z]ed-ƒZ^dGd1d2„Z_d3d4„ Z`e e%d5œZad6d7„ Zbe_eYƒebeaƒG d8d9„ d9ejcƒƒƒZde9g d:¢ƒZee9ee ƒZfe_eYeeB eGe9g d;¢ƒB  ƒG d<d=„ d=edƒƒZge_eYeeB e9d>gƒB ƒG d?d@„ d@edƒƒZhG dAdB„ dBƒZiehegdCœZjdS )Hz
:func:`~pandas.eval` parsers.
é    )ÚannotationsN)ÚpartialÚreduce©Ú	iskeyword)ÚCallableÚClassVarÚTypeVar)ÚUndefinedVariableError)Úis_string_dtype)ÚARITH_OPS_SYMSÚBOOL_OPS_SYMSÚCMP_OPS_SYMSÚ	LOCAL_TAGÚMATHOPSÚ
REDUCTIONSÚUNARY_OPS_SYMSÚBinOpÚConstantÚFuncNodeÚOpÚTermÚUnaryOpÚis_term)Úclean_backtick_quoted_toksÚtokenize_string)ÚScope)ÚprintingÚtokútuple[int, str]Úreturnc                 C  s   | \}}||dkrdfS |fS )a`  
    Rewrite the assignment operator for PyTables expressions that use ``=``
    as a substitute for ``==``.

    Parameters
    ----------
    tok : tuple of int, str
        ints correspond to the all caps constants in the tokenize module

    Returns
    -------
    tuple of int, str
        Either the input or token or the replacement values
    ú=ú==© ©r   ÚtoknumÚtokvalr#   r#   ú_/home/dinkstrade/pdmp-scanner/venv/lib/python3.10/site-packages/pandas/core/computation/expr.pyÚ_rewrite_assign3   s   r(   c                 C  sF   | \}}|t jkr|dkrt jdfS |dkrt jdfS ||fS ||fS )aj  
    Replace ``&`` with ``and`` and ``|`` with ``or`` so that bitwise
    precedence is changed to boolean precedence.

    Parameters
    ----------
    tok : tuple of int, str
        ints correspond to the all caps constants in the tokenize module

    Returns
    -------
    tuple of int, str
        Either the input or token or the replacement values
    ú&Úandú|Úor)ÚtokenizeÚOPÚNAMEr$   r#   r#   r'   Ú_replace_booleansF   s   


r0   c                 C  s,   | \}}|t jkr|dkrt jtfS ||fS )a(  
    Replace local variables with a syntactically valid name.

    Parameters
    ----------
    tok : tuple of int, str
        ints correspond to the all caps constants in the tokenize module

    Returns
    -------
    tuple of int, str
        Either the input or token or the replacement values

    Notes
    -----
    This is somewhat of a hack in that we rewrite a string such as ``'@a'`` as
    ``'__pd_eval_local_a'`` by telling the tokenizer that ``__pd_eval_local_``
    is a ``tokenize.OP`` and to replace the ``'@'`` symbol with it.
    ú@)r-   r.   r   r$   r#   r#   r'   Ú_replace_locals_   s   
r2   c                   s   ‡ ‡fdd„S )z
    Compose 2 callables.
    c                    s   ˆ ˆ| i |¤ŽƒS ©Nr#   )ÚargsÚkwargs©ÚfÚgr#   r'   Ú<lambda>}   s    z_compose2.<locals>.<lambda>r#   r6   r#   r6   r'   Ú	_compose2y   ó   r:   c                  G  s   t | ƒdks
J dƒ‚tt| ƒS )z&
    Compose 2 or more callables.
    é   z.At least 2 callables must be passed to compose)Úlenr   r:   )Úfuncsr#   r#   r'   Ú_compose€   s   
r?   ÚsourceÚstrc                   s,   t ˆ ƒsJ dƒ‚t ‡ fdd„t| ƒD ƒ¡S )aÒ  
    Compose a collection of tokenization functions.

    Parameters
    ----------
    source : str
        A Python source code string
    f : callable
        This takes a tuple of (toknum, tokval) as its argument and returns a
        tuple with the same structure but possibly different elements. Defaults
        to the composition of ``_rewrite_assign``, ``_replace_booleans``, and
        ``_replace_locals``.

    Returns
    -------
    str
        Valid Python source code

    Notes
    -----
    The `f` parameter can be any callable that takes *and* returns input of the
    form ``(toknum, tokval)``, where ``toknum`` is one of the constants from
    the ``tokenize`` module and ``tokval`` is a string.
    zf must be callablec                 3  s   � | ]}ˆ |ƒV  qd S r3   r#   ©Ú.0Úx©r7   r#   r'   Ú	<genexpr>§   ó   € z_preparse.<locals>.<genexpr>)Úcallabler-   Ú
untokenizer   ©r@   r7   r#   rE   r'   Ú	_preparseˆ   s   rK   c                   s   ‡ fdd„S )zO
    Factory for a type checking function of type ``t`` or tuple of types.
    c                   s   t | jˆ ƒS r3   )Ú
isinstanceÚvalue)rD   ©Útr#   r'   r9   ®   s    z_is_type.<locals>.<lambda>r#   rN   r#   rN   r'   Ú_is_typeª   s   rP   c                 c  s*   � | ]}t |tƒrt|tjƒr|V  qd S r3   )rL   ÚtypeÚ
issubclassÚastÚAST©rC   Únoder#   r#   r'   rF   ¶   s   € ý
ý
ÿrF   c                 c  s   � | ]}t t|ƒV  qd S r3   )ÚgetattrrS   )rC   Únamer#   r#   r'   rF   ¸   s   € c                   s   ‡ fdd„|D ƒ}t |ƒS )zE
    Filter out AST nodes that are subclasses of ``superclass``.
    c                 3  s    � | ]}t |ˆ ƒr|jV  qd S r3   )rR   Ú__name__rU   ©Ú
superclassr#   r'   rF   Á   s   € z _filter_nodes.<locals>.<genexpr>)Ú	frozenset)r[   Ú	all_nodesÚ
node_namesr#   rZ   r'   Ú_filter_nodes½   s   r_   c                 c  ó   � | ]}|j V  qd S r3   )rY   rB   r#   r#   r'   rF   Å   ó   € )ÚAssignÚModuleÚExpr)ÚYieldÚGeneratorExpÚIfExpÚDictCompÚSetCompÚReprÚLambdaÚSetrT   ÚIsÚIsNotz$cannot both support and not support Ú	node_nameúCallable[..., None]c                   ó   ‡ fdd„}|S )zV
    Return a function that raises a NotImplementedError with a passed node name.
    c                   s   t dˆ › d�ƒ‚)Nú'z' nodes are not implemented)ÚNotImplementedError)Úselfr4   r5   ©ro   r#   r'   r7     ó   z _node_not_implemented.<locals>.fr#   )ro   r7   r#   ru   r'   Ú_node_not_implementedþ   s   rw   Ú_TÚnodesúset[str]úCallable[[type[_T]], type[_T]]c                   s   d‡ fdd„}|S )z‹
    Decorator to disallow certain nodes from parsing. Raises a
    NotImplementedError instead.

    Returns
    -------
    callable
    Úclsútype[_T]r    c                   sB   d| _ ˆ D ]}t|ƒ}d|› �}|  j |f7  _ t| ||ƒ q| S )Nr#   Úvisit_)Úunsupported_nodesrw   Úsetattr)r|   rV   Ú
new_methodrX   ©ry   r#   r'   Ú
disallowed  s   
zdisallow.<locals>.disallowedN)r|   r}   r    r}   r#   )ry   rƒ   r#   r‚   r'   Údisallow  s   
r„   c                   s   ‡ ‡fdd„}|S )zw
    Return a function to create an op class with its symbol already passed.

    Returns
    -------
    callable
    c                   s   t ˆ ˆg|¢R i |¤ŽS )z’
        Return a partial function with an Op subclass with an operator already passed.

        Returns
        -------
        callable
        )r   )rt   rV   r4   r5   ©Úop_classÚ	op_symbolr#   r'   r7   0  s   z_op_maker.<locals>.fr#   )r†   r‡   r7   r#   r…   r'   Ú	_op_maker'  s   	
rˆ   )ÚbinaryÚunaryc                   rq   )z9
    Decorator to add default implementation of ops.
    c                   sl   ˆ   ¡ D ]/\}}t| |› d�ƒ}t| |› d�ƒ}|D ]}|| }|d ur2t||ƒ}t| d|› �|ƒ qq| S )NÚ_opsÚ_op_nodes_mapr~   )ÚitemsrW   rˆ   r€   )r|   Úop_attr_namer†   ÚopsÚops_mapÚopÚop_nodeÚmade_op©Ú
op_classesr#   r'   r7   E  s   
€üzadd_ops.<locals>.fr#   )r•   r7   r#   r”   r'   Úadd_ops@  s   r–   c                   @  s†  e Zd ZU dZeZded< eZded< e	e
 e ZdZeeeeƒƒZeZdZeeeeƒƒZejejejejejejejejiZded< efdFdd„Zdd„ Zdd„ Zdd„ Zdd„ Z dGdd„Z!dd„ Z"dd„ Z#		dHdd„Z$d d!„ Z%d"d#„ Z&dId%d&„Z'dId'd(„Z(dId)d*„Z)dId+d,„Z*dId-d.„Z+dId/d0„Z,e,Z-d1d2„ Z.dId3d4„Z/dJd6d7„Z0d8d9„ Z1d:d;„ Z2dKd<d=„Z3d>d?„ Z4d@dA„ Z5dBdC„ Z6dDdE„ Z7dS )LÚBaseExprVisitorzÌ
    Custom ast walker. Parsers of other engines should subclass this class
    if necessary.

    Parameters
    ----------
    env : Scope
    engine : str
    parser : str
    preparser : callable
    zClassVar[type[Term]]Ú
const_typeÚ	term_type)ÚGtÚLtÚGtEÚLtEÚEqÚNotEqÚInÚNotInÚBitAndÚBitOrÚAndÚOrÚAddÚSubÚMultÚDivÚPowÚFloorDivÚMod)ÚUAddÚUSubÚInvertÚNotztuple[str, ...]r   r    ÚNonec                 C  s"   || _ || _|| _|| _d | _d S r3   )ÚenvÚengineÚparserÚ	preparserÚassigner©rt   r²   r³   r´   rµ   r#   r#   r'   Ú__init__Š  s
   
zBaseExprVisitor.__init__c              
   K  sŒ   t |tƒr1|  |¡}z
t t |¡¡}W n ty0 } ztdd„ | ¡ D ƒƒr*d|_	|‚d }~ww dt
|ƒj› �}t| |ƒ}||fi |¤ŽS )Nc                 s  s   � | ]}t |ƒV  qd S r3   r   rB   r#   r#   r'   rF   —  rG   z(BaseExprVisitor.visit.<locals>.<genexpr>z4Python keyword not valid identifier in numexpr queryr~   )rL   rA   rµ   rS   Úfix_missing_locationsÚparseÚSyntaxErrorÚanyÚsplitÚmsgrQ   rY   rW   )rt   rV   r5   ÚcleanÚeÚmethodÚvisitorr#   r#   r'   Úvisit‘  s   

€ý
zBaseExprVisitor.visitc                 K  s2   t |jƒdkrtdƒ‚|jd }| j|fi |¤ŽS )Nr<   z#only a single expression is allowedr   )r=   Úbodyr»   rÃ   )rt   rV   r5   Úexprr#   r#   r'   Úvisit_ModuleŸ  s   
zBaseExprVisitor.visit_Modulec                 K  s   | j |jfi |¤ŽS r3   ©rÃ   rM   ©rt   rV   r5   r#   r#   r'   Ú
visit_Expr¥  s   zBaseExprVisitor.visit_Exprc                 C  sÂ   |j }t|ƒ}t|ƒrVt|ƒrV|| jv rVtt||fƒ\}}tt||fƒ\}}	|s.|s.|s.|	r4| j| ƒ }|	rE| j |j	g¡}
|  
|
| j¡}|rV| j |j	g¡}
|  
|
| j¡}|  |¡}||||fS r3   )r‘   rQ   r   Úrewrite_mapÚmapÚ_is_listÚ_is_strr²   Úadd_tmprM   r™   rÃ   )rt   rV   ÚleftÚrightÚop_instanceÚop_typeÚ	left_listÚ
right_listÚleft_strÚ	right_strrX   r‘   r#   r#   r'   Ú_rewrite_membership_op¨  s   
z&BaseExprVisitor._rewrite_membership_opNc                 C  sR   |d u r| j |jdd�}|d u r| j |jdd�}|  |||¡\}}}}||||fS )NrÏ   )ÚsiderÐ   )rÃ   rÏ   rÐ   r×   )rt   rV   rÏ   rÐ   r‘   r†   r#   r#   r'   Ú_maybe_transform_eq_neÃ  s   z&BaseExprVisitor._maybe_transform_eq_nec                 C  s˜   t  t j¡}|jr't|dƒr'|js'|j|kr'| j t  |j¡¡}|  	|| j¡}|jrHt|dƒrH|jsH|j|krH| j t  |j¡¡}|  	|| j¡}||fS )NrM   )
ÚnpÚdtypeÚfloat32Ú	is_scalarÚhasattrÚreturn_typer²   rÎ   rM   r™   )rt   rÏ   rÐ   Úf32rX   r#   r#   r'   Ú_maybe_downcast_constantsË  s(   ÿþý
ÿþý
z)BaseExprVisitor._maybe_downcast_constantsc                 C  s   |  | j| j| j| j|¡S r3   )Úevaluater²   r³   r´   r™   )rt   ÚbinopÚeval_in_pythonr#   r#   r'   Ú_maybe_evalâ  s   ÿzBaseExprVisitor._maybe_eval©Úinznot in©r"   z!=ú<ú>z<=z>=c                 C  sà   |||ƒ}|j rtd|j› d|j› d|j› d�ƒ‚| jdkr6|jtv r)t|ddƒs/t|ddƒr6|  || j¡S |j|v rA|  ||¡S | jdkrnt|dd ƒt	ksft
t|dd ƒƒsft|dd ƒt	ksft
t|dd ƒƒrn|  ||| ¡S |S )	Nz unsupported operand type(s) for z: 'z' and 'rr   ÚpytablesÚis_datetimeFrß   )Úhas_invalid_return_typeÚ	TypeErrorr‘   rQ   r³   r   rW   rå   Ú
binary_opsÚobjectr   )rt   r‘   r†   ÚlhsÚrhsrä   Úmaybe_eval_in_pythonÚresr#   r#   r'   Ú_maybe_evaluate_binopí  s6   
	
ÿÿÿ


ÿ
þ

ÿÿz%BaseExprVisitor._maybe_evaluate_binopc                 K  s2   |   |¡\}}}}|  ||¡\}}|  ||||¡S r3   )rÙ   rá   rõ   )rt   rV   r5   r‘   r†   rÏ   rÐ   r#   r#   r'   Úvisit_BinOp  s   zBaseExprVisitor.visit_BinOpc                 K  s    |   |j¡}|   |j¡}||ƒS r3   )rÃ   r‘   Úoperand)rt   rV   r5   r‘   r÷   r#   r#   r'   Úvisit_UnaryOp  s   zBaseExprVisitor.visit_UnaryOpr   c                 K  s   | j |j| jfi |¤ŽS r3   )r™   Úidr²   rÈ   r#   r#   r'   Ú
visit_Name   s   zBaseExprVisitor.visit_Namec                 K  ó   |   |j| j¡S r3   ©r˜   rM   r²   rÈ   r#   r#   r'   Úvisit_NameConstant$  rv   z"BaseExprVisitor.visit_NameConstantc                 K  rû   r3   rü   rÈ   r#   r#   r'   Ú	visit_Num(  rv   zBaseExprVisitor.visit_Numc                 K  rû   r3   rü   rÈ   r#   r#   r'   Úvisit_Constant+  rv   zBaseExprVisitor.visit_Constantc                 K  s   | j  |j¡}|  || j ¡S r3   )r²   rÎ   Úsr™   ©rt   rV   r5   rX   r#   r#   r'   Ú	visit_Str/  s   zBaseExprVisitor.visit_Strc                   s*   ˆ j  ‡ fdd„|jD ƒ¡}ˆ  |ˆ j ¡S )Nc                   ó   g | ]
}ˆ   |¡ˆ jƒ‘qS r#   ©rÃ   r²   )rC   rÀ   ©rt   r#   r'   Ú
<listcomp>4  ó    z.BaseExprVisitor.visit_List.<locals>.<listcomp>)r²   rÎ   Úeltsr™   r  r#   r  r'   Ú
visit_List3  s   zBaseExprVisitor.visit_Listc                 K  s   |   |j¡S )zdf.index[4]rÇ   rÈ   r#   r#   r'   Úvisit_Index9  s   zBaseExprVisitor.visit_Indexc           
   	   K  s–   ddl m} |  |j¡}|  |j¡}||| j| j| jd�}z|j| }W n ty<   ||| j| j| jd�}|| }Y nw | j 	|¡}	| j
|	| jd�S )Nr   )Úeval)Ú
local_dictr³   r´   )r²   )Úpandasr  rÃ   rM   Úslicer²   r³   r´   ÚAttributeErrorrÎ   r™   )
rt   rV   r5   Úpd_evalrM   ÚslobjÚresultÚvrñ   rX   r#   r#   r'   Úvisit_Subscript=  s    ÿÿûzBaseExprVisitor.visit_Subscriptr  c                 K  sZ   |j }|dur|  |¡j}|j}|dur|  |¡j}|j}|dur'|  |¡j}t|||ƒS )zdf.index[slice(4,6)]N)ÚlowerrÃ   rM   ÚupperÚstepr  )rt   rV   r5   r  r  r  r#   r#   r'   Úvisit_SliceQ  s   zBaseExprVisitor.visit_Slicec                 K  s´   t |jƒdkrtdƒ‚t|jd tjƒstdƒ‚| jjdu r"tdƒ‚z| j	|jd fi |¤Ž}W n t
y?   |jd j}Y nw t|d|ƒ| _| jdu rPtdƒ‚| j	|jfi |¤ŽS )	zÄ
        support a single assignment node, like

        c = a + b

        set the assigner at the top level, must be a Name node which
        might or might not exist in the resolvers

        r<   z#can only assign a single expressionr   z5left hand side of an assignment must be a single nameNz%cannot assign without a target objectrX   z@left hand side of an assignment must be a single resolvable name)r=   Útargetsr»   rL   rS   ÚNamer²   ÚtargetÚ
ValueErrorrÃ   r
   rù   rW   r¶   rM   )rt   rV   r5   r¶   r#   r#   r'   Úvisit_Assign_  s"   
ÿ
ÿzBaseExprVisitor.visit_Assignc           	      K  s”   |j }|j}|j}t|tjƒr@|  |¡j}zt||ƒ}| j 	|¡}|  
|| j¡W S  ty?   t|tjƒr>|j|kr>| Y S ‚ w tdt|ƒj› �ƒ‚)NzInvalid Attribute context )ÚattrrM   ÚctxrL   rS   ÚLoadrÃ   rW   r²   rÎ   r™   r  r  rù   r  rQ   rY   )	rt   rV   r5   r  rM   r  Úresolvedr  rX   r#   r#   r'   Úvisit_Attribute}  s   
üzBaseExprVisitor.visit_Attributec                   sp  t |jtjƒr|jjdkrˆ  |j¡}n.t |jtjƒstdƒ‚zˆ  |j¡}W n t	yA   zt
|jjƒ}W n ty>   ‚ w Y nw |d u rOtd|jj› �ƒ‚t|dƒrW|j}t |t
ƒrv‡ fdd„|jD ƒ}|jrrtd|j› d�ƒ‚||Ž S ‡ fd	d„|jD ƒ}|jD ]!}t |tjƒs•td
|jj› d�ƒ‚|jr¤ˆ  |j¡ˆ jƒ||j< qƒˆ j ||i |¤Ž¡}ˆ j|ˆ jd�S )NÚ__call__z"Only named functions are supportedzInvalid function call rM   c                   s   g | ]}ˆ   |¡‘qS r#   )rÃ   ©rC   Úargr  r#   r'   r  ª  s    z.BaseExprVisitor.visit_Call.<locals>.<listcomp>z
Function "z$" does not support keyword argumentsc                   r  r#   r  r$  r  r#   r'   r  ´  r  z keyword error in function call 'rr   )rX   r²   )rL   ÚfuncrS   Ú	Attributer  r"  r  rî   rÃ   r
   r   rù   r  rÞ   rM   r4   ÚkeywordsrX   Úkeywordr%  r²   rÎ   r™   )rt   rV   rØ   r5   rô   Únew_argsÚkeyrX   r#   r  r'   Ú
visit_Call‘  sP   þÿýÿ

ÿ
ÿÿ€zBaseExprVisitor.visit_Callc                 C  s   |S r3   r#   )rt   r‘   r#   r#   r'   Útranslate_InÄ  s   zBaseExprVisitor.translate_Inc              	   K  sª   |j }|j}t|ƒdkr#|  |d ¡}tj||j|d d�}|  |¡S |j}g }t||ƒD ]\}}	|  tj	|	g||  |¡gd�¡}
|	}| 
|
¡ q-|  tjt ¡ |d�¡S )Nr<   r   )r‘   rÏ   rÐ   )ÚcomparatorsrÏ   r�   )r‘   Úvalues)r�   r.  r=   r-  rS   r   rÏ   rÃ   ÚzipÚCompareÚappendÚBoolOpr¤   )rt   rV   r5   r�   Úcompsr‘   rã   rÏ   r/  ÚcompÚnew_noder#   r#   r'   Úvisit_CompareÇ  s   
ÿzBaseExprVisitor.visit_Comparec                 C  s   t |ttfƒr	|S |  |¡S r3   )rL   r   r   rÃ   )rt   Úbopr#   r#   r'   Ú_try_visit_binopÜ  s   
z BaseExprVisitor._try_visit_binopc                   s   ‡ ‡fdd„}ˆ j }t||ƒS )Nc                   s<   ˆ  | ¡}ˆ  |¡}ˆ ˆ ||¡\}}}}ˆ |ˆ j||¡S r3   )r9  rÙ   rõ   r‘   )rD   Úyrñ   rò   r‘   r†   ©rV   rt   r#   r'   rÂ   â  s   

z-BaseExprVisitor.visit_BoolOp.<locals>.visitor)r/  r   )rt   rV   r5   rÂ   Úoperandsr#   r;  r'   Úvisit_BoolOpá  s   
zBaseExprVisitor.visit_BoolOp©r    r±   )NN)ræ   rè   )r    r   )r    r  r3   )8rY   Ú
__module__Ú__qualname__Ú__doc__r   r˜   Ú__annotations__r   r™   r   r   r   rï   Úbinary_op_nodesÚdictr0  Úbinary_op_nodes_mapr   Ú	unary_opsÚunary_op_nodesÚunary_op_nodes_maprS   rž   r    rŸ   r¡   rÊ   rK   r¸   rÃ   rÆ   rÉ   r×   rÙ   rá   rå   rõ   rö   rø   rú   rý   rþ   rÿ   r  r	  Úvisit_Tupler
  r  r  r  r"  r,  r-  r7  r9  r=  r#   r#   r#   r'   r—   S  s\   
 ü

ù)








3r—   )ÚDictr3  r    r¡   )r3  r'  r    r¡   ÚTuplec                      s2   e Zd Zeeeeeeƒd�fd‡ fdd„Z	‡  Z
S )ÚPandasExprVisitorrE   r    r±   c                   s   t ƒ  ||||¡ d S r3   ©Úsuperr¸   r·   ©Ú	__class__r#   r'   r¸   ö  s   
zPandasExprVisitor.__init__r>  )rY   r?  r@  r   rK   r?   r2   r0   r   r¸   Ú__classcell__r#   r#   rO  r'   rL  ñ  s    

þûrL  r°   c                      s(   e Zd Zddd„fd	‡ fdd„Z‡  ZS )
ÚPythonExprVisitorNc                 C  s   | S r3   r#   rJ   r#   r#   r'   r9     s    zPythonExprVisitor.<lambda>r    r±   c                   s   t ƒ j||||d� d S )N)rµ   rM  r·   rO  r#   r'   r¸     s   zPythonExprVisitor.__init__r3   r>  )rY   r?  r@  r¸   rQ  r#   r#   rO  r'   rR    s    ÿrR  c                   @  sz   e Zd ZU dZded< ded< ded< 					
dddd„Zedd„ ƒZdd„ Zd dd„Z	d!dd„Z
dd„ Zedd„ ƒZd	S )"rd   a  
    Object encapsulating an expression.

    Parameters
    ----------
    expr : str
    engine : str, optional, default 'numexpr'
    parser : str, optional, default 'pandas'
    env : Scope, optional, default None
    level : int, optional, default 2
    r   r²   rA   r³   r´   Únumexprr  Nr   úScope | NoneÚlevelÚintr    r±   c                 C  sL   || _ |pt|d d�| _|| _|| _t| | j| j| jƒ| _|  ¡ | _d S )Nr<   )rU  )	rÅ   r   r²   r³   r´   ÚPARSERSÚ_visitorrº   Úterms)rt   rÅ   r³   r´   r²   rU  r#   r#   r'   r¸     s   zExpr.__init__c                 C  s   t | jdd ƒS )Nr¶   )rW   rX  r  r#   r#   r'   r¶   +  s   zExpr.assignerc                 C  s   |   | j¡S r3   )rY  r²   r  r#   r#   r'   r#  /  ó   zExpr.__call__c                 C  s   t  | j¡S r3   )r   Úpprint_thingrY  r  r#   r#   r'   Ú__repr__2  rZ  zExpr.__repr__c                 C  s
   t | jƒS r3   )r=   rÅ   r  r#   r#   r'   Ú__len__5  s   
zExpr.__len__c                 C  s   | j  | j¡S )z&
        Parse an expression.
        )rX  rÃ   rÅ   r  r#   r#   r'   rº   8  r;   z
Expr.parsec                 C  s2   t | jƒrt| jjgƒS tdd„ t | j¡D ƒƒS )z1
        Get the names in an expression.
        c                 s  r`   r3   )rX   )rC   Útermr#   r#   r'   rF   E  ra   zExpr.names.<locals>.<genexpr>)r   rY  r\   rX   ÚcomÚflattenr  r#   r#   r'   Únames>  s   
z
Expr.names)rS  r  Nr   )
r³   rA   r´   rA   r²   rT  rU  rV  r    r±   )r    rA   )r    rV  )rY   r?  r@  rA  rB  r¸   Úpropertyr¶   r#  r\  r]  rº   ra  r#   r#   r#   r'   rd     s$   
 ú


rd   )Úpythonr  )r   r   r    r   )r@   rA   r    rA   )ro   rA   r    rp   )ry   rz   r    r{   )krA  Ú
__future__r   rS   Ú	functoolsr   r   r)  r   r-   Útypingr   r   r	   ÚnumpyrÚ   Úpandas.errorsr
   Úpandas.core.dtypes.commonr   Úpandas.core.commonÚcoreÚcommonr_  Úpandas.core.computation.opsr   r   r   r   r   r   r   r   r   r   r   r   r   r   Úpandas.core.computation.parsingr   r   Úpandas.core.computation.scoper   Úpandas.io.formatsr   r(   r0   r2   r:   r?   rK   rP   ÚlistrÌ   rA   rÍ   r\   ÚdirÚ
_all_nodesr_   Ú_all_node_namesÚmodÚ
_mod_nodesÚstmtÚ_stmt_nodesrÅ   Ú_expr_nodesÚexpr_contextÚ_expr_context_nodesÚboolopÚ_boolop_nodesÚoperatorÚ_operator_nodesÚunaryopÚ_unary_op_nodesÚcmpopÚ_cmp_op_nodesÚcomprehensionÚ_comprehension_nodesÚexcepthandlerÚ_handler_nodesÚ	argumentsÚ_arguments_nodesÚ_keyword_nodesÚaliasÚ_alias_nodesÚ_hacked_nodesÚ_unsupported_expr_nodesÚ_unsupported_nodesÚ_base_supported_nodesÚintersectionÚ_msgrw   rx   r„   rˆ   Ú_op_classesr–   ÚNodeVisitorr—   Ú_python_not_supportedÚ_numexpr_supported_callsrL  rR  rd   rW  r#   r#   r#   r'   Ú<module>   s¼    @



ÿþ"þ












ÿÿþýüûúù÷



   ÿÿ=