
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
U
    ¡ê,a£a  ã                   @   sj  d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	 dddd	d
dddddddgZ
G dd
„ d
ejƒZG dd„ dejƒZG dd„ deƒZG dd„ dƒZG dd„ deeeƒZG dd„ deeƒZdd„ Zdd„ ZG dd„ deƒZG dd„ deƒZG d d„ deƒZG d!d„ deƒZG d"d„ deƒZG d#d$„ d$ƒZG d%d„ deeƒZG d&d„ deeƒZG d'd	„ d	eƒZdS )(z4Utilities for with-statement contexts.  See PEP 343.é    N)Údeque©Úwraps©Ú
MethodTypeÚasynccontextmanagerÚcontextmanagerÚclosingÚnullcontextÚAbstractContextManagerÚAbstractAsyncContextManagerÚAsyncExitStackÚContextDecoratorÚ	ExitStackÚredirect_stdoutÚredirect_stderrÚsuppressc                   @   s2   e Zd ZdZdd„ Zejdd„ ƒZedd„ ƒZ	dS )	r   z,An abstract base class for context managers.c                 C   s   | S ©z0Return `self` upon entering the runtime context.© ©Úselfr   r   ú//opt/alt/python38/lib64/python3.8/contextlib.pyÚ	__enter__   s    z AbstractContextManager.__enter__c                 C   s   dS ©z9Raise any exception triggered within the runtime context.Nr   ©r   Úexc_typeÚ	exc_valueÚ	tracebackr   r   r   Ú__exit__   s    zAbstractContextManager.__exit__c                 C   s   | t krt |dd¡S tS )Nr   r   )r   Ú_collections_abcÚ_check_methodsÚNotImplemented©ÚclsÚCr   r   r   Ú__subclasshook__   s    z'AbstractContextManager.__subclasshook__N)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚabcÚabstractmethodr   Úclassmethodr%   r   r   r   r   r      s   
c                   @   s2   e Zd ZdZdd„ Zejdd„ ƒZedd„ ƒZ	dS )	r   z9An abstract base class for asynchronous context managers.c                 Ã   s   | S r   r   r   r   r   r   Ú
__aenter__'   s    z&AbstractAsyncContextManager.__aenter__c                 Ã   s   dS r   r   r   r   r   r   Ú	__aexit__+   s    z%AbstractAsyncContextManager.__aexit__c                 C   s   | t krt |dd¡S tS )Nr-   r.   )r   r   r    r!   r"   r   r   r   r%   0   s
    ÿz,AbstractAsyncContextManager.__subclasshook__N)
r&   r'   r(   r)   r-   r*   r+   r.   r,   r%   r   r   r   r   r   #   s   
c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )r   zJA base class or mixin that enables context managers to work as decorators.c                 C   s   | S )a6  Return a recreated instance of self.

        Allows an otherwise one-shot context manager like
        _GeneratorContextManager to support use as
        a decorator via implicit recreation.

        This is a private interface just for _GeneratorContextManager.
        See issue #11647 for details.
        r   r   r   r   r   Ú_recreate_cm;   s    
zContextDecorator._recreate_cmc                    s   t ˆ ƒ‡ ‡fdd„ƒ}|S )Nc               
      s*   ˆ  ¡ � ˆ | |ŽW  5 Q R £ S Q R X d S ©N)r/   ©ÚargsÚkwds©Úfuncr   r   r   ÚinnerH   s    
z(ContextDecorator.__call__.<locals>.innerr   )r   r5   r6   r   r4   r   Ú__call__G   s    zContextDecorator.__call__N)r&   r'   r(   r)   r/   r7   r   r   r   r   r   8   s   c                   @   s   e Zd ZdZdd„ ZdS )Ú_GeneratorContextManagerBasezBShared functionality for @contextmanager and @asynccontextmanager.c                 C   sJ   |||Ž| _ |||  | _| _| _t|dd ƒ}|d kr@t| ƒj}|| _d S )Nr)   )Úgenr5   r2   r3   ÚgetattrÚtyper)   )r   r5   r2   r3   Údocr   r   r   Ú__init__R   s    
z%_GeneratorContextManagerBase.__init__N)r&   r'   r(   r)   r=   r   r   r   r   r8   O   s   r8   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	Ú_GeneratorContextManagerz%Helper for @contextmanager decorator.c                 C   s   |   | j| j| j¡S r0   )Ú	__class__r5   r2   r3   r   r   r   r   r/   f   s    z%_GeneratorContextManager._recreate_cmc                 C   s<   | ` | `| `zt| jƒW S  tk
r6   tdƒd ‚Y nX d S ©Nzgenerator didn't yield)r2   r3   r5   Únextr9   ÚStopIterationÚRuntimeErrorr   r   r   r   r   l   s
    z"_GeneratorContextManager.__enter__c              
   C   s  |d kr8zt | jƒ W n tk
r,   Y dS X tdƒ‚nÌ|d krF|ƒ }z| j |||¡ W n  tk
rˆ } z||k	 W Y ¢S d }~X Y nt tk
rØ } z4||krªW Y ¢&dS |tkrÆ|j|krÆW Y ¢
dS ‚ W 5 d }~X Y n$   t ¡ d |krôY dS ‚ Y nX tdƒ‚d S )NFúgenerator didn't stopé   z#generator didn't stop after throw())rA   r9   rB   rC   ÚthrowÚ	__cause__ÚsysÚexc_info)r   r;   Úvaluer   Úexcr   r   r   r   u   s.    


z!_GeneratorContextManager.__exit__N)r&   r'   r(   r)   r/   r   r   r   r   r   r   r>   a   s   	r>   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )Ú_AsyncGeneratorContextManagerz Helper for @asynccontextmanager.c                 Ã   s6   z| j  ¡ I d H W S  tk
r0   tdƒd ‚Y nX d S r@   )r9   Ú	__anext__ÚStopAsyncIterationrC   r   r   r   r   r-   ©   s    z(_AsyncGeneratorContextManager.__aenter__c              
   Ã   s&  |d kr>z| j  ¡ I d H  W n tk
r2   Y d S X tdƒ‚nä|d krL|ƒ }z"| j  |||¡I d H  tdƒ‚W n² tk
rœ } z||k	 W Y ¢S d }~X Y n† tk
rò } z:||kr¾W Y ¢,dS t|ttfƒrà|j|kràW Y ¢
dS ‚ W 5 d }~X Y n0 tk
�r  } z||k	�r‚ W 5 d }~X Y nX d S )NrD   z$generator didn't stop after athrow()F)	r9   rM   rN   rC   ÚathrowÚ
isinstancerB   rG   ÚBaseException)r   ÚtyprJ   r   rK   r   r   r   r.   ¯   s.    




z'_AsyncGeneratorContextManager.__aexit__N)r&   r'   r(   r)   r-   r.   r   r   r   r   rL   ¥   s   rL   c                    s   t ˆ ƒ‡ fdd„ƒ}|S )aÛ  @contextmanager decorator.

    Typical usage:

        @contextmanager
        def some_generator(<arguments>):
            <setup>
            try:
                yield <value>
            finally:
                <cleanup>

    This makes this:

        with some_generator(<arguments>) as <variable>:
            <body>

    equivalent to this:

        <setup>
        try:
            <variable> = <value>
            <body>
        finally:
            <cleanup>
    c                     s   t ˆ | |ƒS r0   )r>   r1   ©r5   r   r   Úhelperî   s    zcontextmanager.<locals>.helperr   ©r5   rT   r   rS   r   r   Ó   s    c                    s   t ˆ ƒ‡ fdd„ƒ}|S )aý  @asynccontextmanager decorator.

    Typical usage:

        @asynccontextmanager
        async def some_async_generator(<arguments>):
            <setup>
            try:
                yield <value>
            finally:
                <cleanup>

    This makes this:

        async with some_async_generator(<arguments>) as <variable>:
            <body>

    equivalent to this:

        <setup>
        try:
            <variable> = <value>
            <body>
        finally:
            <cleanup>
    c                     s   t ˆ | |ƒS r0   )rL   r1   rS   r   r   rT     s    z#asynccontextmanager.<locals>.helperr   rU   r   rS   r   r   ô   s    c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	r	   a2  Context to automatically close something at the end of a block.

    Code like this:

        with closing(<module>.open(<arguments>)) as f:
            <block>

    is equivalent to this:

        f = <module>.open(<arguments>)
        try:
            <block>
        finally:
            f.close()

    c                 C   s
   || _ d S r0   ©Úthing)r   rW   r   r   r   r=   &  s    zclosing.__init__c                 C   s   | j S r0   rV   r   r   r   r   r   (  s    zclosing.__enter__c                 G   s   | j  ¡  d S r0   )rW   Úclose)r   rI   r   r   r   r   *  s    zclosing.__exit__N©r&   r'   r(   r)   r=   r   r   r   r   r   r   r	     s   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )Ú_RedirectStreamNc                 C   s   || _ g | _d S r0   )Ú_new_targetÚ_old_targets)r   Ú
new_targetr   r   r   r=   2  s    z_RedirectStream.__init__c                 C   s*   | j  tt| jƒ¡ tt| j| jƒ | jS r0   )r\   Úappendr:   rH   Ú_streamÚsetattrr[   r   r   r   r   r   7  s    z_RedirectStream.__enter__c                 C   s   t t| j| j ¡ ƒ d S r0   )r`   rH   r_   r\   Úpop©r   ÚexctypeÚexcinstÚexctbr   r   r   r   <  s    z_RedirectStream.__exit__)r&   r'   r(   r_   r=   r   r   r   r   r   r   rZ   .  s   rZ   c                   @   s   e Zd ZdZdZdS )r   aA  Context manager for temporarily redirecting stdout to another file.

        # How to send help() to stderr
        with redirect_stdout(sys.stderr):
            help(dir)

        # How to write help() to a file
        with open('help.txt', 'w') as f:
            with redirect_stdout(f):
                help(pow)
    ÚstdoutN©r&   r'   r(   r)   r_   r   r   r   r   r   @  s   c                   @   s   e Zd ZdZdZdS )r   zCContext manager for temporarily redirecting stderr to another file.ÚstderrNrg   r   r   r   r   r   P  s   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	r   a?  Context manager to suppress specified exceptions

    After the exception is suppressed, execution proceeds with the next
    statement following the with statement.

         with suppress(FileNotFoundError):
             os.remove(somefile)
         # Execution still resumes here if the file was already removed
    c                 G   s
   || _ d S r0   )Ú_exceptions)r   Ú
exceptionsr   r   r   r=   a  s    zsuppress.__init__c                 C   s   d S r0   r   r   r   r   r   r   d  s    zsuppress.__enter__c                 C   s   |d k	ot || jƒS r0   )Ú
issubclassri   rb   r   r   r   r   g  s    
zsuppress.__exit__NrY   r   r   r   r   r   V  s   
c                   @   sh   e Zd ZdZedd„ ƒZedd„ ƒZdd„ Zdd	„ Zd
d„ Z	dd„ Z
dd„ Zde_dd„ Zddd„ZdS )Ú_BaseExitStackz.A base class for ExitStack and AsyncExitStack.c                 C   s
   t || ƒS r0   r   ©ÚcmÚcm_exitr   r   r   Ú_create_exit_wrapperw  s    z#_BaseExitStack._create_exit_wrapperc                   s   ‡ ‡‡fdd„}|S )Nc                    s   ˆˆ ˆŽ d S r0   r   ©r   rK   Útb©r2   Úcallbackr3   r   r   Ú_exit_wrapper}  s    z8_BaseExitStack._create_cb_wrapper.<locals>._exit_wrapperr   ©rt   r2   r3   ru   r   rs   r   Ú_create_cb_wrapper{  s    z!_BaseExitStack._create_cb_wrapperc                 C   s   t ƒ | _d S r0   )r   Ú_exit_callbacksr   r   r   r   r=   �  s    z_BaseExitStack.__init__c                 C   s   t | ƒƒ }| j|_tƒ | _|S )z@Preserve the context stack by transferring it to a new instance.)r;   rx   r   )r   Ú	new_stackr   r   r   Úpop_all„  s    
z_BaseExitStack.pop_allc                 C   sB   t |ƒ}z
|j}W n tk
r0   |  |¡ Y nX |  ||¡ |S )a  Registers a callback with the standard __exit__ method signature.

        Can suppress exceptions the same way __exit__ method can.
        Also accepts any object with an __exit__ method (registering a call
        to the method instead of the object itself).
        )r;   r   ÚAttributeErrorÚ_push_exit_callbackÚ_push_cm_exit©r   ÚexitÚ_cb_typeÚexit_methodr   r   r   Úpush‹  s    	
z_BaseExitStack.pushc                 C   s(   t |ƒ}|j}| |¡}|  ||¡ |S )z«Enters the supplied context manager.

        If successful, also pushes its __exit__ method as a callback and
        returns the result of the __enter__ method.
        )r;   r   r   r}   ©r   rn   Ú_cm_typeÚ_exitÚresultr   r   r   Úenter_contextŸ  s
    
z_BaseExitStack.enter_contextc                  O   s”   t | ƒdkr| ^}}} nV| s&tdƒ‚nHd|krZ| d¡}| ^}} ddl}|jdtdd� ntdt | ƒd	  ƒ‚|j|f| ž|Ž}||_| |¡ |S )
z\Registers an arbitrary callback and arguments.

        Cannot suppress exceptions.
        é   zBdescriptor 'callback' of '_BaseExitStack' object needs an argumentrt   r   Nú4Passing 'callback' as keyword argument is deprecated©Ú
stacklevelz8callback expected at least 1 positional argument, got %drE   )	ÚlenÚ	TypeErrorra   ÚwarningsÚwarnÚDeprecationWarningrw   Ú__wrapped__r|   ©r2   r3   r   rt   rŽ   ru   r   r   r   rt   ­  s&    

 ÿ
ÿ
z_BaseExitStack.callbackú#($self, callback, /, *args, **kwds)c                 C   s   |   ||¡}|  |d¡ dS )z;Helper to correctly register callbacks to __exit__ methods.TN)rp   r|   ©r   rn   ro   ru   r   r   r   r}   Ê  s    z_BaseExitStack._push_cm_exitTc                 C   s   | j  ||f¡ d S r0   )rx   r^   )r   rt   Úis_syncr   r   r   r|   Ï  s    z"_BaseExitStack._push_exit_callbackN)T)r&   r'   r(   r)   Ústaticmethodrp   rw   r=   rz   r‚   r‡   rt   Ú__text_signature__r}   r|   r   r   r   r   rl   t  s   

rl   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	r   a‹  Context manager for dynamic management of a stack of exit callbacks.

    For example:
        with ExitStack() as stack:
            files = [stack.enter_context(open(fname)) for fname in filenames]
            # All opened files will automatically be closed at the end of
            # the with statement, even if attempts to open files later
            # in the list raise an exception.
    c                 C   s   | S r0   r   r   r   r   r   r   ß  s    zExitStack.__enter__c           
         sÖ   |d d k	}t  ¡ d ‰ ‡ fdd„}d}d}| jr’| j ¡ \}}|sHt‚z||Ž r^d}d}d}W q,   t  ¡ }||d |d ƒ d}|}Y q,X q,|rÎz|d j}	|d ‚W n  tk
rÌ   |	|d _‚ Y nX |oÔ|S )Nr   rE   c                    s4   | j }||krd S |d ks*|ˆ kr$q*|} q || _ d S r0   ©Ú__context__©Únew_excÚold_excÚexc_context©Ú	frame_excr   r   Ú_fix_exception_contextè  s    z2ExitStack.__exit__.<locals>._fix_exception_contextFT©NNN)rH   rI   rx   ra   ÚAssertionErrorr™   rQ   )
r   Úexc_detailsÚreceived_excr    Úsuppressed_excÚpending_raiser•   ÚcbÚnew_exc_detailsÚ	fixed_ctxr   rž   r   r   â  s4    

zExitStack.__exit__c                 C   s   |   ddd¡ dS ©z%Immediately unwind the context stack.N)r   r   r   r   r   rX     s    zExitStack.closeN)r&   r'   r(   r)   r   r   rX   r   r   r   r   r   Ô  s   
1c                   @   sf   e Zd ZdZedd„ ƒZedd„ ƒZdd„ Zdd	„ Zd
d„ Z	de	_
dd„ Zdd„ Zdd„ Zdd„ ZdS )r   a×  Async context manager for dynamic management of a stack of exit
    callbacks.

    For example:
        async with AsyncExitStack() as stack:
            connections = [await stack.enter_async_context(get_connection())
                for i in range(5)]
            # All opened connections will automatically be released at the
            # end of the async with statement, even if attempts to open a
            # connection later in the list raise an exception.
    c                 C   s
   t || ƒS r0   r   rm   r   r   r   Ú_create_async_exit_wrapper&  s    z)AsyncExitStack._create_async_exit_wrapperc                   s   ‡ ‡‡fdd„}|S )Nc                 “   s   ˆˆ ˆŽI d H  d S r0   r   rq   rs   r   r   ru   ,  s    z>AsyncExitStack._create_async_cb_wrapper.<locals>._exit_wrapperr   rv   r   rs   r   Ú_create_async_cb_wrapper*  s    z'AsyncExitStack._create_async_cb_wrapperc                 Ã   s.   t |ƒ}|j}| |¡I dH }|  ||¡ |S )z³Enters the supplied async context manager.

        If successful, also pushes its __aexit__ method as a callback and
        returns the result of the __aenter__ method.
        N)r;   r.   r-   Ú_push_async_cm_exitrƒ   r   r   r   Úenter_async_context0  s
    z"AsyncExitStack.enter_async_contextc                 C   sD   t |ƒ}z
|j}W n  tk
r2   |  |d¡ Y nX |  ||¡ |S )a#  Registers a coroutine function with the standard __aexit__ method
        signature.

        Can suppress exceptions the same way __aexit__ method can.
        Also accepts any object with an __aexit__ method (registering a call
        to the method instead of the object itself).
        F)r;   r.   r{   r|   r­   r~   r   r   r   Úpush_async_exit<  s    
zAsyncExitStack.push_async_exitc                  O   s–   t | ƒdkr| ^}}} nV| s&tdƒ‚nHd|krZ| d¡}| ^}} ddl}|jdtdd� ntdt | ƒd	  ƒ‚|j|f| ž|Ž}||_| |d
¡ |S )zfRegisters an arbitrary coroutine function and arguments.

        Cannot suppress exceptions.
        rˆ   zMdescriptor 'push_async_callback' of 'AsyncExitStack' object needs an argumentrt   r   Nr‰   rŠ   zCpush_async_callback expected at least 1 positional argument, got %drE   F)	rŒ   r�   ra   rŽ   r�   r�   r¬   r‘   r|   r’   r   r   r   Úpush_async_callbackN  s&    

 ÿ
ÿz"AsyncExitStack.push_async_callbackr“   c                 Ã   s   |   ddd¡I dH  dS rª   )r.   r   r   r   r   Úaclosek  s    zAsyncExitStack.aclosec                 C   s   |   ||¡}|  |d¡ dS )zLHelper to correctly register coroutine function to __aexit__
        method.FN)r«   r|   r”   r   r   r   r­   o  s    z"AsyncExitStack._push_async_cm_exitc                 Ã   s   | S r0   r   r   r   r   r   r-   u  s    zAsyncExitStack.__aenter__c                 ‡   sæ   |d d k	}t  ¡ d ‰ ‡ fdd„}d}d}| jr¢| j ¡ \}}z0|rP||Ž }n||Ž I d H }|rnd}d}d}W q,   t  ¡ }	||	d |d ƒ d}|	}Y q,X q,|rÞz|d j}
|d ‚W n  tk
rÜ   |
|d _‚ Y nX |oä|S )Nr   rE   c                    s4   | j }||krd S |d ks*|ˆ kr$q*|} q || _ d S r0   r˜   rš   rž   r   r   r    ~  s    z8AsyncExitStack.__aexit__.<locals>._fix_exception_contextFTr¡   )rH   rI   rx   ra   r™   rQ   )r   r£   r¤   r    r¥   r¦   r•   r§   Úcb_suppressr¨   r©   r   rž   r   r.   x  s8    


zAsyncExitStack.__aexit__N)r&   r'   r(   r)   r–   r«   r¬   r®   r¯   r°   r—   r±   r­   r-   r.   r   r   r   r   r     s   

c                   @   s*   e Zd ZdZd	dd„Zdd„ Zdd„ ZdS )
r
   aO  Context manager that does no additional processing.

    Used as a stand-in for a normal context manager, when a particular
    block of code is only sometimes used with a normal context manager:

    cm = optional_cm if condition else nullcontext()
    with cm:
        # Perform operation, using optional_cm if condition is True
    Nc                 C   s
   || _ d S r0   ©Úenter_result)r   r´   r   r   r   r=   ¹  s    znullcontext.__init__c                 C   s   | j S r0   r³   r   r   r   r   r   ¼  s    znullcontext.__enter__c                 G   s   d S r0   r   )r   Úexcinfor   r   r   r   ¿  s    znullcontext.__exit__)NrY   r   r   r   r   r
   ®  s   

)r)   r*   rH   r   Úcollectionsr   Ú	functoolsr   Útypesr   Ú__all__ÚABCr   r   Úobjectr   r8   r>   rL   r   r   r	   rZ   r   r   r   rl   r   r   r
   r   r   r   r   Ú<module>   sN        ýþDÿ.!!`E 