o
    i0                     @   s   d Z ddlmZ ddlmZ ddlmZ ddlmZ G dd deZ	d	d
 Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZG dd  d eZG d!d" d"eZd(d$d%d&d'Zd#S ))z0Variants of ObjectProxy for different use cases.    )Callable)
ModuleType   )BaseObjectProxy)synchronizedc                       s4   e Zd ZdZedd Z fddZdd Z  ZS )ObjectProxya  A generic object proxy which forwards special methods as needed.
    For backwards compatibility this class adds support for `__iter__()`. If
    you don't need backward compatibility for `__iter__()` support then it is
    preferable to use `BaseObjectProxy` directly. If you want automatic
    support for special dunder methods for callables, iterators, and async,
    then use `AutoObjectProxy`.c                 C   s   t S N)r   self r   C/mnt/sdb/aimis/docanh/lib/python3.10/site-packages/wrapt/proxies.py__object_proxy__   s   zObjectProxy.__object_proxy__c                    s   t  | S r   )super__new__)clsargskwargs	__class__r   r   r         zObjectProxy.__new__c                 C   
   t | jS r   iter__wrapped__r	   r   r   r   __iter__      
zObjectProxy.__iter__)	__name__
__module____qualname____doc__propertyr   r   r   __classcell__r   r   r   r   r      s    
r   c                  O   s$   dd }||  \}} |j | i |S )Nc                 W   s   | |fS r   r   )r
   r   r   r   r   _unpack_self%   s   z&__wrapper_call__.<locals>._unpack_self)r   )r   r   r"   r
   r   r   r   __wrapper_call__$   s   r#   c                 C   r   r   r   r	   r   r   r   __wrapper_iter__-   r   r$   c                 C   
   | j  S r   )r   __next__r	   r   r   r   __wrapper_next__1   r   r'   c                 C   r%   r   )r   	__aiter__r	   r   r   r   __wrapper_aiter__5   r   r)   c                    s   | j  I d H S r   )r   	__anext__r	   r   r   r   __wrapper_anext__9      r+   c                 C   r%   r   )r   __length_hint__r	   r   r   r   __wrapper_length_hint__=   r   r.   c                 c   s    | j  E d H S r   )r   	__await__r	   r   r   r   __wrapper_await__A   r,   r0   c                 C      | j ||S r   )r   __get__)r
   instanceownerr   r   r   __wrapper_get__E      r5   c                 C   r1   r   )r   __set__)r
   r3   valuer   r   r   __wrapper_set__I   r6   r9   c                 C   s   | j |S r   )r   
__delete__)r
   r3   r   r   r   __wrapper_delete__M   r   r;   c                 C   r1   r   )r   __set_name__)r
   r4   namer   r   r   __wrapper_set_name__Q   r6   r>   c                       s(   e Zd ZdZ fddZdd Z  ZS )AutoObjectProxya  An object proxy which can automatically adjust to the wrapped object
    and add special dunder methods as needed. Note that this creates a new
    class for each instance, so it has much higher memory overhead than using
    `BaseObjectProxy` directly. If you know what special dunder methods you need
    then it is preferable to use `BaseObjectProxy` directly and add them to a
    subclass as needed. If you only need `__iter__()` support for backwards
    compatibility then use `ObjectProxy` instead.
    c                    sN  i }t |}tt | }t|rd|vrt|d< d|v r$d|vr$t|d< d|v r0d|vr0t|d< d|v r<d|vr<t|d< d|v rHd|vrHt|d< d|v rTd|vrTt|d< d|v r`d|vr`t	|d< d|v rld|vrlt
|d< d	|v rxd	|vrxt|d	< d
|v rd
|vrt|d
< d|v rd|vrt|d< | j}| tu rtj}tt| t|| f|S )zInjects special dunder methods into a dynamically created subclass
        as needed based on the wrapped object.
        __call__r   r&   r(   r*   r-   r/   r2   r7   r:   r<   )dirsetcallabler#   r$   r'   r)   r+   r.   r0   r5   r9   r;   r>   r   r?   r   r   r   type)r   wrapped	namespacewrapped_attrsclass_attrsr=   r   r   r   r   _   s:   zAutoObjectProxy.__new__c                 C   s~  t | }tt|}t| jrd|vrt|_nt|ddtu r$t|d t	| jdr2d|vr1t
|_nt|ddt
u r?t|d t	| jdrMd|vrLt|_nt|ddtu rZt|d t	| jdrhd|vrgt|_nt|ddtu rut|d t	| jdrd|vrt|_nt|ddtu rt|d t	| jdrd|vrt|_nt|ddtu rt|d t	| jdrd|vrt|_nt|ddtu rt|d t	| jd	rd	|vrt|_nt|d	dtu rt|d	 t	| jd
rd
|vrt|_nt|d
dtu rt|d
 t	| jdrd|vrt|_nt|ddtu rt|d t	| jdr-d|vr+t|_dS dS t|ddtu r=t|d dS dS )zAdjusts special dunder methods on the class as needed based on the
        wrapped object, when `__wrapped__` is changed.
        rA   Nr   r&   r(   r*   r-   r/   r2   r7   r:   r<   )rE   rC   rB   rD   r   r#   rA   getattrdelattrhasattrr$   r   r'   r&   r)   r(   r+   r*   r.   r-   r0   r/   r5   r2   r9   r7   r;   r:   r>   r<   )r
   r   rI   r   r   r   __wrapped_setattr_fixups__   s   













z*AutoObjectProxy.__wrapped_setattr_fixups__)r   r   r   r   r   rM   r!   r   r   r   r   r?   U   s    	6r?   c                       sP   e Zd ZdZddd fddZddd fddZd	Zd
d Zdd Z  Z	S )LazyObjectProxyzhAn object proxy which can generate/create the wrapped object on demand
    when it is first needed.
    N.	interfacec                   sP  |du rt d}i }t|}tt| }d|v r d|vr t|d< d|v r,d|vr,t|d< d|v r8d|vr8t|d< d|v rDd|vrDt|d< d|v rPd|vrPt|d< d|v r\d|vr\t|d< d	|v rhd	|vrht	|d	< d
|v rtd
|vrtt
|d
< d|v rd|vrt|d< d|v rd|vrt|d< d|v rd|vrt|d< | j}tt| t || f|S )r@   .NrA   r   r&   r(   r*   r-   r/   r2   r7   r:   r<   )rE   rB   rC   r#   r$   r'   r)   r+   r.   r0   r5   r9   r;   r>   r   r   r?   r   )r   callbackrP   rG   interface_attrsrI   r=   r   r   r   r      s<   zLazyObjectProxy.__new__c                   s   |dur|| _ t d dS )a  Initialize the object proxy with wrapped object as `None` but due
        to presence of special `__wrapped_factory__` attribute addded first,
        this will actually trigger the deferred creation of the wrapped object
        when first needed.
        N)__wrapped_factory__r   __init__)r
   rQ   rP   r   r   r   rT     s   zLazyObjectProxy.__init__Fc                 C   s   d S r   r   r	   r   r   r   rS   ,  s   z#LazyObjectProxy.__wrapped_factory__c                 C   s`   t t|   | jr| jW  d   S |  | _d| _| jW  d   S 1 s)w   Y  dS )z2Gets the wrapped object, creating it if necessary.NT)r   rE   __wrapped_initialized__r   rS   r	   r   r   r   __wrapped_get__/  s   

$zLazyObjectProxy.__wrapped_get__r   )
r   r   r   r   r   rT   rU   rS   rV   r!   r   r   r   r   rN      s    9rN   N.rO   c                   s<    dur|du r
t }n|du rt} fdd}t||dS )aN  Lazily imports the module `name`, returning a `LazyObjectProxy` which
    will import the module when it is first needed. When `name is a dotted name,
    then the full dotted name is imported and the last module is taken as the
    target. If `attribute` is provided then it is used to retrieve an attribute
    from the module.
    N.c                     s$   t dgd}  d urt|  S | S )N )fromlist)
__import__rJ   )module	attributer=   r   r   _importW  s   
zlazy_import.<locals>._importrO   )r   r   rN   )r=   r\   rP   r]   r   r[   r   lazy_importH  s   r^   r   )r   collections.abcr   typesr   	__wrapt__r   
decoratorsr   r   r#   r$   r'   r)   r+   r.   r0   r5   r9   r;   r>   r?   rN   r^   r   r   r   r   <module>   s*    	 h