???<!-- GIF89;a -->
123123123123
.....................................................................................................................................???<!-- GIF89;a -->
123123123123
.....................................................................................................................................3

  \j3                 @   s   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ddd	d
ddgZG dd dej	Z
G dd deZG dd dee
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	e
ZdS )z4Utilities for with-statement contexts.  See PEP 343.    N)deque)wrapscontextmanagerclosingAbstractContextManager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   "/usr/lib64/python3.6/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j|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               @   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   j    | |S Q R X d S )N)r!   )argskwds)funcr   r   r   inner1   s    
z(ContextDecorator.__call__.<locals>.inner)r   )r   r$   r%   r   )r$   r   r   __call__0   s    zContextDecorator.__call__N)r   r   r   r   r!   r&   r   r   r   r   r   !   s   c               @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )_GeneratorContextManagerz%Helper for @contextmanager decorator.c             C   sJ   |||| _ |||  | _| _| _t|dd }|d kr@t| j}|| _d S )Nr   )genr$   r"   r#   getattrtyper   )r   r$   r"   r#   docr   r   r   __init__;   s    
z!_GeneratorContextManager.__init__c             C   s   | j | j| j| jS )N)	__class__r$   r"   r#   )r   r   r   r   r!   I   s    z%_GeneratorContextManager._recreate_cmc             C   s.   y
t | jS  tk
r(   tdd Y nX d S )Nzgenerator didn't yield)nextr(   StopIterationRuntimeError)r   r   r   r   r   O   s    
z"_GeneratorContextManager.__enter__c             C   s   |d kr6yt | j W n tk
r*   dS X tdn|d krD| }y| jj||| W n tk
r| } z||k	S d }~X nf tk
r } z*||krdS |tkr|j|krdS  W Y d d }~X n"   tj d |krdS  Y nX tdd S )NFzgenerator didn't stop   z#generator didn't stop after throw())r.   r(   r/   r0   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   r'   8   s
   r'   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 )N)r'   )r"   r#   )r$   r   r   helper   s    zcontextmanager.<locals>.helper)r   )r$   r8   r   )r$   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 )N)thing)r   r9   r   r   r   r,      s    zclosing.__init__c             C   s   | j S )N)r9   )r   r   r   r   r      s    zclosing.__enter__c             G   s   | j j  d S )N)r9   close)r   r5   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 )N)_new_target_old_targets)r   
new_targetr   r   r   r,      s    z_RedirectStream.__init__c             C   s*   | j jtt| j tt| j| j | jS )N)r=   appendr)   r4   _streamsetattrr<   )r   r   r   r   r      s    z_RedirectStream.__enter__c             C   s   t t| j| jj  d S )N)rA   r4   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   r;      s   r;   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.stderrN)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 )	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 )N)_exceptions)r   
exceptionsr   r   r   r,      s    zsuppress.__init__c             C   s   d S )Nr   )r   r   r   r   r      s    zsuppress.__enter__c             C   s   |d k	ot || jS )N)
issubclassrH   )r   rC   rD   rE   r   r   r   r      s    
zsuppress.__exit__N)r   r   r   r   r,   r   r   r   r   r   r   r      s   	c               @   sP   e Zd Z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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   t  | _d S )N)r   _exit_callbacks)r   r   r   r   r,     s    zExitStack.__init__c             C   s   t |  }| j|_t | _|S )z?Preserve the context stack by transferring it to a new instance)r*   rK   r   )r   	new_stackr   r   r   pop_all  s    
zExitStack.pop_allc                s"    fdd} |_ | j| dS )z:Helper to correctly register callbacks to __exit__ methodsc                 s    f|  S )Nr   )exc_details)cmcm_exitr   r   _exit_wrapper  s    z.ExitStack._push_cm_exit.<locals>._exit_wrapperN)__self__push)r   rO   rP   rQ   r   )rO   rP   r   _push_cm_exit  s    zExitStack._push_cm_exitc             C   sD   t |}y
|j}W n  tk
r2   | jj| Y nX | j|| |S )a  Registers a callback with the standard __exit__ method signature

        Can suppress exceptions the same way __exit__ methods can.

        Also accepts any object with an __exit__ method (registering a call
        to the method instead of the object itself)
        )r*   r   AttributeErrorrK   r?   rT   )r   exit_cb_typeexit_methodr   r   r   rS      s    

zExitStack.pushc                s$    fdd}|_ | j| S )z\Registers an arbitrary callback and arguments.

        Cannot suppress exceptions.
        c                s     d S )Nr   )r   r7   tb)r"   callbackr#   r   r   rQ   9  s    z)ExitStack.callback.<locals>._exit_wrapper)__wrapped__rS   )r   rZ   r"   r#   rQ   r   )r"   rZ   r#   r   rZ   4  s    
zExitStack.callbackc             C   s(   t |}|j}|j|}| j|| |S )zEnters 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   rT   )r   rO   _cm_type_exitresultr   r   r   enter_contextA  s
    
zExitStack.enter_contextc             C   s   | j ddd dS )z$Immediately unwind the context stackN)r   )r   r   r   r   r:   N  s    zExitStack.closec       	         s   |d d k	}t j d   fdd}d}d}x\| jr| jj }y|| rTd}d}d}W q.   t j }||d |d  d}|}Y q.X q.W |ry|d j}|d W n  tk
r   ||d _ Y nX |o|S )Nr   r1   c                s8   x,| j }||krd S |d ks$| kr&P |} qW || _ d S )N)__context__)new_excold_excexc_context)	frame_excr   r   _fix_exception_contextX  s    z2ExitStack.__exit__.<locals>._fix_exception_contextFT)NNN)r4   r5   rK   rB   r`   BaseException)	r   rN   received_excre   suppressed_excpending_raisecbnew_exc_details	fixed_ctxr   )rd   r   r   R  s2    


zExitStack.__exit__N)r   r   r   r   r,   rM   rT   rS   rZ   r_   r:   r   r   r   r   r   r     s   )r   r   r4   r   collectionsr   	functoolsr   __all__ABCr   objectr   r'   r   r   r;   r	   r
   r   r   r   r   r   r   <module>   s$   I"