o
    \ZhpA                     @   s   d Z ddl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mZm	Z	m
Z
 dZedZejjZejjZG dd deZd	d
 ZdddZdd ZdddZG dd deZeeZdd Zdd Zdd ZdS )zv
Decorator module, see
https://github.com/micheles/decorator/blob/master/docs/documentation.md
for the documentation.
    N)_GeneratorContextManager)getfullargspeciscoroutinefunctionisgeneratorfunctionz5.1.1z\s*def\s*([_\w][_\w\d]*)\s*\(c                   @   sb   e Zd ZdZe Zd Z Z Z	 Z
 ZZ		dddZdd Zdd	d
Ze		dddZdS )FunctionMakerz
    An object with the ability to create functions with a given signature.
    It has attributes name, doc, module, signature, defaults, dict and
    methods update and make.
     Nc                 C   s  || _ |r|j| _| jdkrd| _|j| _|j| _t|rt	|}t
|di | _dD ]}	t| |	t
||	 q+t| jD ]\}
}t| d|
 | q<t| j}t| j}| jrg|d| j  |d| j  n| jro|d | jD ]}	|d|	  |d|	|	f  qr| jr|d	| j  |d	| j  d
|| _d
|| _ |j | _|r|| _|d ur|| _|r|| _|r|| _|r|| _|r|| _t| dsJ t| dstd| d S )Nz<lambda>Z_lambda___annotations__)argsvarargsvarkwdefaults
kwonlyargskwonlydefaultszarg%d*z%s=Nonez%s=%sz**, name	signaturez%You are decorating a non function: %s)shortsignature__name__r   __doc__doc
__module__moduleinspect	isroutiner   getattrannotationssetattr	enumerater	   listr
   appendr   r   joinr   __dict__copydictr   hasattr	TypeError)selffuncr   r   r   r   r   ZfuncdictZargspecaiargZallargsZallshortargsr   r   @/var/www/html/lang_env/lib/python3.10/site-packages/decorator.py__init__@   s\   






zFunctionMaker.__init__c                 K   s   | j |_t| dd|_t| di |_| j|_| jpd|_t| dd|_	zt
d}W n ty5   d}Y nw |jdd}t| d||_|j| dS )	zD
        Update the signature of func with the data in self
        r   Nr$   r      ?r   r   )r   r   r   r   r"   r   __defaults__r   __kwdefaults__r   sys	_getframeAttributeError	f_globalsgetr   update)r'   r(   kwframeZcallermoduler   r   r,   r7   t   s   zFunctionMaker.updateFc                 K   s  |t |  }|p	i }t|}|du rtd| |d}t|gdd | jdD  }|D ]}	|	dv r>td|	|f q0|	d	sH|d	7 }d
t
| j }
zt||
d}t|| W n tyr   tdtjd t|tjd  w || }|r}||d< | j|fi | |S )zT
        Make a new function from a given template and update the signature
        Nz not a valid function template
%s   c                 S   s   g | ]}| d qS )z *)strip.0r+   r   r   r,   
<listcomp>   s    z&FunctionMaker.make.<locals>.<listcomp>,)_func__call_z%s is overridden in
%s
z<decorator-gen-%d>singlezError in generated code:)fileZ
__source__)varsDEFsearchSyntaxErrorgroupsetr   split	NameErrorendswithnext_compile_countcompileexec	Exceptionprintr2   stderrr7   )r'   Z	src_templevaldict	addsourceattrssrcmor   namesnfilenamecoder(   r   r   r,   make   s:   




zFunctionMaker.makeTc                 K   s   t |tr| dd\}	}
|
dd }d}nd}	d}|}| ||	||||}ddd | D }|d}|rGt|rGd	| d
d}nd| }|j	|||fi |S )z
        Create a function from the strings name, signature and body.
        evaldict is the evaluation dictionary. If addsource is true an
        attribute __source__ is added to the result. The attributes attrs
        are added, if any.
        (r:   NrB   c                 s   s    | ]}d | V  qdS )z    Nr   )r=   liner   r   r,   	<genexpr>       z'FunctionMaker.create.<locals>.<genexpr>rA   z#async def %(name)s(%(signature)s):
returnzreturn awaitzdef %(name)s(%(signature)s):
)

isinstancestrr;   rK   r!   
splitlinesr6   r   replacer^   )clsobjbodyrU   r   r   r   rV   rW   r   restr   r(   r'   Zibodycallerr   r   r,   create   s    
	
zFunctionMaker.create)NNNNNNNNF)NNNT)r   r   __qualname__r   	itertoolscountrO   r	   r
   r   r   r   r   r-   r7   r^   classmethodrn   r   r   r   r,   r   3   s    
4
$r   c                 C   s$   |j | i |}|  |j|jfS )zA
    Fix args and kwargs to be consistent with the signature
    )bindapply_defaultsr	   kwargs)r	   rv   sigbar   r   r,   fix   s   ry   r   Fc                    s(  t t r fdd}nt r# fdd}n
 fdd}j|_j|_|_|_j|_zj	|_	W n	 t
yN   Y nw zj|_W n	 t
y^   Y nw zj|_W n	 t
yn   Y nw zj|_W n	 t
y~   Y nw z
|jj W |S  t
y   Y |S w )af  
    Decorates a function/generator/coroutine using a caller.
    If kwsyntax is True calling the decorated functions with keyword
    syntax will pass the named arguments inside the ``kw`` dictionary,
    even if such argument are positional, similarly to what functools.wraps
    does. By default kwsyntax is False and the the arguments are untouched.
    c                     s6   st | |\} } g|  R i |I d H S Nry   r	   r8   rm   extrasr(   kwsyntaxrw   r   r,   fun   s    zdecorate.<locals>.func                  ?   s@    st | |\} } g|  R i |D ]}|V  qd S rz   r{   )r	   r8   resr}   r   r,   r      s   c                     s.   s
t | |\} } g|  R i |S rz   r{   r|   r}   r   r,   r      s   )r   r   r   r   r   r   __wrapped____signature__rp   r0   r4   r1   r   r   r"   r7   )r(   rm   r~   r   r   r   r}   r,   decorate   sL   
r   c                    s    fdd}|S )z
    A version of "decorator" implemented via "exec" and not via the
    Signature object. Use this if you are want to preserve the `.__code__`
    object properties (https://github.com/micheles/decorator/issues/129).
    c                    s   t j| dt | d| | jdS )Nz)return _call_(_func_, %(shortsignature)s))rA   r@   )r   rp   )r   rn   r$   rp   r(   rm   r   r,   dec  s   
zdecoratorx.<locals>.decr   )rm   r   r   r   r,   
decoratorx  s   r   c                    s   |durt | dS t }dd |j D d	 fdd	}|jd|_ j|_ j|_ |_	 j
|_
t dd|_|j j |S )
zG
    decorator(caller) converts a caller function into a decorator
    Nr   c                 S   s   g | ]	}|j tu r|qS r   )kindPOSr=   pr   r   r,   r>     s    zdecorator.<locals>.<listcomp>c                    sT   t |d }|tfdd|d  D   | d u r# fddS t|  S )Nr:   c                 3   s*    | ]}|j tur |j|j V  qd S rz   )defaultEMPTYr6   r   r   )r8   r   r,   rb   "  s    
z)decorator.<locals>.dec.<locals>.<genexpr>c                    s   t |  S rz   r   r   )rm   r~   r   r   r,   <lambda>&  s    z(decorator.<locals>.dec.<locals>.<lambda>)lentupler   )r(   r	   r8   narm   Z
dec_paramsr   )r~   r8   r,   r      s   

zdecorator.<locals>.dec)
parametersr1   rz   )r   r   r   r   valuesrh   r   r   r   r   rp   r   r1   r"   r7   )rm   Z_funcr   rw   r   r   r   r,   	decorator  s   
	r   c                   @   s   e Zd Zdd Zdd ZdS )ContextManagerc                 O   s   t | ||| d S rz   )r   r-   )r'   gr)   kr   r   r,   r-   7  s   zContextManager.__init__c                    s    fdd}t ||S )Nc                    sP    j  jg jR i  j | |i |W  d    S 1 s!w   Y  d S rz   )	__class__r(   r	   kwds)fr)   r   r'   r   r,   rm   ;  s    $z'ContextManager.__call__.<locals>.callerr   )r'   r(   rm   r   r   r,   __call__:  s   
zContextManager.__call__N)r   r   rp   r-   r   r   r   r   r,   r   6  s    r   c                 C   s   t | S rz   )_contextmanagerr   r   r   r,   contextmanagerD  s   r   c                 C   sT   d}t |D ]\}}t|| rd} nt| |r| ||< d}q|r(||  dS dS )z_
    Append ``a`` to the list of the virtual ancestors, unless it is already
    included.
    TFN)r   
issubclassr    )r)   
vancestorsaddjvar   r   r,   r    K  s   

r    c                     sL   sJ ddd  tjdffdd	  fdd}d	 |_|S )
zr
    Factory of decorators turning a function into a generic function
    dispatching on the given arguments.
    zNo dispatch args passedz(%s,)r    c                    s0   |t | t  rtdt  t | |f dS )z5Make sure one passes the expected number of argumentszExpected %d arguments, got %d%sN)r   r&   )	argumentsZwrongmsg)dispatch_argsr   r,   checke  s
   zdispatch_on.<locals>.checkc                    s   t tj}t |kstd i fddfdd fdd} fdd	} fd
d}tjd t|d| |d
S )z4Decorator turning a function into a generic functionzUnknown dispatch arguments %sc                     sn    |  dd t tD }D ]}t| ||D ]\}}}t||r.|| vr.t|| qqdd |D S )zU
            Get a list of sets of virtual ancestors for the given types
            c                 S   s   g | ]}g qS r   r   )r=   _r   r   r,   r>   z  s    zIdispatch_on.<locals>.gen_func_dec.<locals>.vancestors.<locals>.<listcomp>c                 S   s   g | ]}t |qS r   )rJ   )r=   rar   r   r,   r>     s    )ranger   zipr   mror    )typesZrastypes_ttype_r   )r   r   typemapr   r,   r   u  s   
z5dispatch_on.<locals>.gen_func_dec.<locals>.vancestorsc                     s    |  g }t | |  D ]7\}}t|}|dkr!td||f |dkr7|\}td||fi  dd }n| }||dd  q|S )zG
            Get a list of virtual MROs, one for each type
            r:   zAmbiguous dispatch for %s: %sr   Nr`   )r   r   RuntimeErrortyper   r    )r   listsr   ZvasZn_vasr   r   )r   r   r   r,   	ancestors  s   
z4dispatch_on.<locals>.gen_func_dec.<locals>.ancestorsc                     s      fdd}|S )zU
            Decorator to register an implementation for the given types
            c                    s&    t | jtjd| j  | < | S )Nz in )r   r	   operatorltr   )r   )r   r   r   r   r,   r     s   z@dispatch_on.<locals>.gen_func_dec.<locals>.register.<locals>.decr   )r   r   )r   r   )r   r,   register  s   z3dispatch_on.<locals>.gen_func_dec.<locals>.registerc                     s<   |  g }t j |   D ]}|tdd |D  q|S )zI
            An utility to introspect the dispatch algorithm
            c                 s   s    | ]}|j V  qd S rz   )r   )r=   r)   r   r   r,   rb     s    zKdispatch_on.<locals>.gen_func_dec.<locals>.dispatch_info.<locals>.<genexpr>)rq   productr    r   )r   lstZanc)r   r   r   r,   dispatch_info  s
   z8dispatch_on.<locals>.gen_func_dec.<locals>.dispatch_infoc                    s   t dd | D }z| }W n	 ty   Y nw ||i |S tj |  }t| |D ]}|}|d urA||i |  S q-|i |S )Nc                 s   s    | ]}t |V  qd S rz   )r   r<   r   r   r,   rb     rc   zGdispatch_on.<locals>.gen_func_dec.<locals>._dispatch.<locals>.<genexpr>)r   KeyErrorrq   r   rN   r6   )r   r	   r8   r   r   combinationsr   )r   r(   r   r   r,   	_dispatch  s   
z4dispatch_on.<locals>.gen_func_dec.<locals>._dispatchz#return _f_(%s, %%(shortsignature)s))Z_f_)r   r   r   r   r   r   r   )rJ   r   r	   rL   r   rn   r$   )r(   Zargsetr   r   r   r   r   Zdispatch_str)r   r(   r   r   r,   gen_func_deck  s   
z!dispatch_on.<locals>.gen_func_decdispatch_on)r!   r   ner   )r   r   r   r   r,   r   ]  s   
Wr   )r   Fro   )r   rer2   r   r   rq   
contextlibr   r   r   r   __version__rP   rF   	ParameterPOSITIONAL_OR_KEYWORDr   emptyr   objectr   ry   r   r   r   r   r   r   r    r   r   r   r   r,   <module>   s.   
 
	6
!