
    5 f                    L   d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
mZmZmZmZ ddlmZ ddlmZmZ dd	lmZ dd
lm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# ddl$m%Z%m&Z& dZ' G d dej(                  Z)d(d)dZ*	 d(d*dZ+d+dZ,d,d"Z- ee-d#$          Z.d-d'Z/dS ).z9Astroid hooks for understanding functools library module.    )annotations)Iterator)partial)chain)BoundMethod	argumentsextract_nodenodesobjects)InferenceContext)InferenceErrorUseInferenceDefault)inference_tip)objectmodel)AstroidManager)
AssignName	AttributeCallName)FunctionDef)InferenceResultSuccessfulInferenceResult)UninferableBase
safe_inferzfunctools.lru_cachec                  T    e Zd ZdZed             Zed             Zed             ZdS )LruWrappedModelzSpecial attribute model for functions decorated with functools.lru_cache.

    The said decorators patches at decoration time some functions onto
    the decorated function.
    c                    | j         S N)	_instance)selfs    S/var/www/equiseq/venv/lib/python3.11/site-packages/astroid/brain/brain_functools.pyattr___wrapped__z LruWrappedModel.attr___wrapped__"   s
    ~    c                z    t          d           G fddt                    } || j        | j                  S )NzQ
        from functools import _CacheInfo
        _CacheInfo(0, 0, 0, 0)
        c                       e Zd Z	 d	d
 fdZdS )=LruWrappedModel.attr_cache_info.<locals>.CacheInfoBoundMethodNcaller SuccessfulInferenceResult | NonecontextInferenceContext | NonereturnIterator[InferenceResult]c              3  :   K   t                    }|J |V  d S r   )r   )r    r'   r)   res
cache_infos       r!   infer_call_resultzOLruWrappedModel.attr_cache_info.<locals>.CacheInfoBoundMethod.infer_call_result0   s,      
 !,,					r#   r   )r'   r(   r)   r*   r+   r,   )__name__
__module____qualname__r0   )r/   s   r!   CacheInfoBoundMethodr&   /   s=         48        r#   r4   proxybound)r	   r   r   )r    r4   r/   s     @r!   attr_cache_infozLruWrappedModel.attr_cache_info&   sg    !
 

	 	 	 	 	 	 	; 	 	 	 $#$.OOOOr#   c                z    t          d          }t          || j        j                                                  S )Nzdef cache_clear(self): passr5   )r	   r   r   parentscope)r    nodes     r!   attr_cache_clearz LruWrappedModel.attr_cache_clear;   s4    =>>T^-B-H-H-J-JKKKKr#   N)r1   r2   r3   __doc__propertyr"   r8   r=    r#   r!   r   r      sw            X P P XP( L L XL L Lr#   r   Nr)   r*   r+   Nonec                >     t                      |           | _        d S r   )r   special_attributes)r<   r)   s     r!   _transform_lru_cacherD   A   s"     0o//55Dr#   r<   
nodes.Call!Iterator[objects.PartialFunction]c           	        t           j                            | |          }t          |j                  }|dk     rt          d          |dk    r|j        st          d          |j        d         }	 t          |                    |                    }n!# t          t          f$ r}t
          |d }~ww xY wt          |t                    rt          d          t          |t                    st          d          |j        sg }n5t          |j        j        pd|j        j        pd|j        j        pd          }d	 |D             }t%          |j                  |z
  rt          d
          t'          j        ||j        |j        |j        | j                  }|                    |j        |j        |j        |j        |j        |j        |j                   tA          |f          S )N)r)      z-functools.partial takes at least one argumentz>functools.partial needs at least to have some filled argumentsr   z!Cannot infer the wrapped functionz&The wrapped function is not a functionr@   c                F    h | ]}t          |t                    |j        S r@   )
isinstancer   name).0params     r!   	<setcomp>z/_functools_partial_inference.<locals>.<setcomp>k   s9       z%7T7T
  r#   z,wrapped function received unknown parameters)rK   lineno
col_offsetr:   )argsbody
decoratorsreturnstype_comment_returnstype_comment_argsdoc_node)!r   CallSite	from_calllenpositional_argumentsr   keyword_argumentsnextinferr   StopIterationrJ   r   r   rQ   r   posonlyargs
kwonlyargssetr   PartialFunctionrK   rO   rP   r:   postinitrR   rS   rT   rU   rV   rW   iter)	r<   r)   callnumber_of_positionalpartial_functioninferred_wrapped_functionexcfunction_parametersparameter_namess	            r!   _functools_partial_inferencerm   K   sC    ''g'>>Dt899a!"QRRRq  )? !L
 
 	
 03+$()9)?)?)?)P)P$Q$Q!!M* + + +!s*++_== G!"EFFF/== L!"JKKK %) 
 #%*/52%*6<"%*5;
 

  3  O 4!""_4 R!"PQQQ.&+(/,7{   &+&+,7)16K3E*3     !#$$$s   5#B B7*B22B7boolc                    | j         sdS | j         j        D ]2}t          |t          t          f          st          |d          r dS 3dS )z=Check if the given function node is decorated with lru_cache.F	lru_cacheT)rS   r
   rJ   r   r   _looks_like_functools_member)r<   	decorators     r!   _looks_like_lru_cachers      sb    ? u_*  	)i%677 	'	;?? 	44	5r#   Attribute | Callmemberstrc                V   t          | t                    r| j        |k    S t          | j        t                    r| j        j        |k    S t          | j        t                    rD| j        j        |k    o3t          | j        j        t                    o| j        j        j        dk    S dS )z?Check if the given Call node is the wanted member of functools.	functoolsF)rJ   r   attrnamefuncr   rK   expr)r<   ru   s     r!   rq   rq      s    $	"" '}&&$)T"" (y~''$)Y'' 
I&( 349>4003	#{2	

 5r#   r   )ru   managerr   c                    |                      t          t          t                     |                      t          t          t                    t                     d S r   )register_transformr   rD   rs   r   r   rm   _looks_like_partial)r|   s    r!   registerr      sP    {,@BWXXX233    r#   r   )r)   r*   r+   rA   )r<   rE   r)   r*   r+   rF   )r+   rn   )r<   rt   ru   rv   r+   rn   )r|   r   r+   rA   )0r>   
__future__r   collections.abcr   rx   r   	itertoolsr   astroidr   r   r	   r
   r   astroid.contextr   astroid.exceptionsr   r   astroid.inference_tipr   astroid.interpreterr   astroid.managerr   astroid.nodes.node_classesr   r   r   r   astroid.nodes.scoped_nodesr   astroid.typingr   r   astroid.utilr   r   	LRU_CACHEFunctionModelr   rD   rm   rs   rq   r   r   r@   r#   r!   <module>r      s  
 @ ? " " " " " " $ $ $ $ $ $             H H H H H H H H H H H H H H , , , , , , B B B B B B B B / / / / / / + + + + + + * * * * * * H H H H H H H H H H H H 2 2 2 2 2 2 E E E E E E E E 4 4 4 4 4 4 4 4!	#L #L #L #L #Lk/ #L #L #LL6 6 6 6 6 :>6% 6% 6% 6% 6%r	 	 	 	    g:9MMM      r#   