
    cP                       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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# 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+ e            ,                    e!e'e)            e            ,                    e ee(          e+           dS )%z9Astroid hooks for understanding functools library module.    )annotations)Iterator)partial)chain)BoundMethod	argumentsextract_nodehelpersnodesobjects)InferenceContext)InferenceErrorUseInferenceDefault)inference_tip)objectmodel)AstroidManager)
AssignName	AttributeCallName)FunctionDef)Uninferablez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    =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contextInferenceContext | Nonec              3  8   K   t          j                  V  d S r   )r
   
safe_infer)r   callerr%   
cache_infos      r   infer_call_resultzOLruWrappedModel.attr_cache_info.<locals>.CacheInfoBoundMethod.infer_call_result/   s&       (4444444r!   r   )r%   r&   )__name__
__module____qualname__r+   )r*   s   r   CacheInfoBoundMethodr$   .   s;        AE5 5 5 5 5 5 5 5 5r!   r/   proxybound)r	   r   r   )r   r/   r*   s     @r   attr_cache_infozLruWrappedModel.attr_cache_info%   sg    !
 

	5 	5 	5 	5 	5 	5 	5; 	5 	5 	5 $#$.OOOOr!   c                z    t          d          }t          || j        j                                                  S )Nzdef cache_clear(self): passr0   )r	   r   r   parentscope)r   nodes     r   attr_cache_clearz LruWrappedModel.attr_cache_clear6   s4    =>>T^-B-H-H-J-JKKKKr!   N)r,   r-   r.   __doc__propertyr    r3   r8    r!   r   r   r      sw            X P P XP  L L XL L Lr!   r   Nr%   r&   returnNonec                >     t                      |           | _        d S r   )r   special_attributes)r7   r%   s     r   _transform_lru_cacher@   <   s"     0o//55Dr!   r7   
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          u 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>f   s9       z%7T7T
  r!   z,wrapped function received unknown parameters)rG   lineno
col_offsetr5   )argsbody
decoratorsreturnstype_comment_returnstype_comment_argsdoc_node)!r   CallSite	from_calllenpositional_argumentsr   keyword_argumentsnextinferr   StopIterationr   rF   r   rM   r   posonlyargs
kwonlyargssetr   PartialFunctionrG   rK   rL   r5   postinitrN   rO   rP   rQ   rR   rS   iter)	r7   r%   callnumber_of_positionalpartial_functioninferred_wrapped_functionexcfunction_parametersparameter_namess	            r   _functools_partial_inferenceri   F   sD    ''g'>>Dt899a S!"QRRRq  
)? 
!L
 
 	
 03+$()9)?)?)?)P)P$Q$Q!!M* + + +!s*+ K/ 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 ]+}t          |t                    st	          |d          r dS ,dS )z=Check if the given function node is decorated with lru_cache.F	lru_cacheT)rO   r   rF   r   _looks_like_functools_member)r7   	decorators     r   _looks_like_lru_cachero      s]    ? u_*  	)T** 	'	;?? 	44	5r!   c                   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 )z9Check if the given Call node is a functools.partial call.	functoolsF)rF   funcr   rG   r   attrnameexpr)r7   members     r   rm   rm      s|    $)T"" (y~''$)Y'' 
I&( 349>4003	#{2	

 5r!   r   )ru   r   )r%   r&   r<   r=   )r7   rA   r%   r&   r<   rB   )r<   rj   )-r9   
__future__r   collections.abcr   rq   r   	itertoolsr   astroidr   r   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.utilr   	LRU_CACHEFunctionModelr   r@   ri   ro   rm   _looks_like_partialregister_transformr;   r!   r   <module>r      sL  
 @ ? " " " " " " $ $ $ $ $ $             Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q , , , , , , 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 $ $ $ $ $ $!	L L L L Lk/ L L LD6 6 6 6 6 :>6% 6% 6% 6% 6%r	 	 	 	
 
 
 
 g:9MMM     # #%'<  
    # #M.//    r!   