3 \j3@sdZddlZddlZddlZddlmZddlmZddddd d d d gZGd ddej Z Gddde Z Gddde e Z ddZGddde ZGddde ZGdd d eZGdd d eZGdd d e ZGdd d e ZdS)z4Utilities for with-statement contexts. See PEP 343.N)deque)wrapscontextmanagerclosingAbstractContextManagerContextDecorator ExitStackredirect_stdoutredirect_stderrsuppressc@s2eZdZdZddZejddZeddZ dS) rz,An abstract base class for context managers.cCs|S)z0Return `self` upon entering the runtime context.)selfr r "/usr/lib64/python3.6/contextlib.py __enter__sz AbstractContextManager.__enter__cCsdS)z9Raise any exception triggered within the runtime context.Nr )r exc_type exc_value tracebackr r r__exit__szAbstractContextManager.__exit__cCs|tkrtj|ddStS)Nrr)r_collections_abc_check_methodsNotImplemented)clsCr r r__subclasshook__sz'AbstractContextManager.__subclasshook__N) __name__ __module__ __qualname____doc__rabcabstractmethodr classmethodrr r r rr sc@s eZdZdZddZddZdS)rzJA base class or mixin that enables context managers to work as decorators.cCs|S)a6Return 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 zContextDecorator._recreate_cmcstfdd}|S)Nc sj ||SQRXdS)N)r!)argskwds)funcr r rinner1s z(ContextDecorator.__call__..inner)r)r r$r%r )r$r r__call__0szContextDecorator.__call__N)rrrrr!r&r r r rr!s c@s0eZdZdZddZddZddZdd Zd S) _GeneratorContextManagerz%Helper for @contextmanager decorator.cCsJ||||_||||_|_|_t|dd}|dkr@t|j}||_dS)Nr)genr$r"r#getattrtyper)r r$r"r#docr r r__init__;s    z!_GeneratorContextManager.__init__cCs|j|j|j|jS)N) __class__r$r"r#)r r r rr!Isz%_GeneratorContextManager._recreate_cmc Cs.y t|jStk r(tddYnXdS)Nzgenerator didn't yield)nextr( StopIteration RuntimeError)r r r rrOs z"_GeneratorContextManager.__enter__cCs|dkr6yt|jWntk r*dSXtdn|dkrD|}y|jj|||Wntk r|}z||k Sd}~Xnftk r}z*||krdS|tkr|j|krdSWYdd}~Xn"tjd|krdSYnXtddS)NFzgenerator didn't stopz#generator didn't stop after throw())r.r(r/r0throw __cause__sysexc_info)r r*valuerexcr r rrUs. z!_GeneratorContextManager.__exit__N)rrrrr,r!rrr r r rr'8s r'cstfdd}|S)a@contextmanager decorator. Typical usage: @contextmanager def some_generator(): try: yield finally: This makes this: with some_generator() as : equivalent to this: try: = finally: cs t||S)N)r')r"r#)r$r rhelperszcontextmanager..helper)r)r$r8r )r$rrsc@s(eZdZdZddZddZddZdS) ra2Context to automatically close something at the end of a block. Code like this: with closing(.open()) as f: is equivalent to this: f = .open() try: finally: f.close() cCs ||_dS)N)thing)r r9r r rr,szclosing.__init__cCs|jS)N)r9)r r r rrszclosing.__enter__cGs|jjdS)N)r9close)r r5r r rrszclosing.__exit__N)rrrrr,rrr r r rrsc@s(eZdZdZddZddZddZdS)_RedirectStreamNcCs||_g|_dS)N) _new_target _old_targets)r new_targetr r rr,sz_RedirectStream.__init__cCs*|jjtt|jtt|j|j|jS)N)r=appendr)r4_streamsetattrr<)r r r rrsz_RedirectStream.__enter__cCstt|j|jjdS)N)rAr4r@r=pop)r exctypeexcinstexctbr r rrsz_RedirectStream.__exit__)rrrr@r,rrr r r rr;sr;c@seZdZdZdZdS)r aAContext 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)rrrrr@r r r rr s c@seZdZdZdZdS)r zCContext manager for temporarily redirecting stderr to another file.stderrN)rrrrr@r r r rr sc@s(eZdZdZddZddZddZdS) 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 cGs ||_dS)N) _exceptions)r exceptionsr r rr,szsuppress.__init__cCsdS)Nr )r r r rrszsuppress.__enter__cCs|dk ot||jS)N) issubclassrH)r rCrDrEr r rrs zsuppress.__exit__N)rrrrr,rrr r r rr s c@sPeZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ dS)raContext 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 cCs t|_dS)N)r_exit_callbacks)r r r rr,szExitStack.__init__cCst|}|j|_t|_|S)z?Preserve the context stack by transferring it to a new instance)r*rKr)r new_stackr r rpop_alls zExitStack.pop_allcs"fdd}|_|j|dS)z:Helper to correctly register callbacks to __exit__ methodscsf|S)Nr ) exc_details)cmcm_exitr r _exit_wrappersz.ExitStack._push_cm_exit.._exit_wrapperN)__self__push)r rOrPrQr )rOrPr _push_cm_exitszExitStack._push_cm_exitc CsDt|}y |j}Wn tk r2|jj|YnX|j|||S)aRegisters 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*rAttributeErrorrKr?rT)r exit_cb_type exit_methodr r rrS s   zExitStack.pushcs$fdd}|_|j|S)z\Registers an arbitrary callback and arguments. Cannot suppress exceptions. csdS)Nr )rr7tb)r"callbackr#r rrQ9sz)ExitStack.callback.._exit_wrapper) __wrapped__rS)r rZr"r#rQr )r"rZr#rrZ4s zExitStack.callbackcCs(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*rrrT)r rO_cm_type_exitresultr r r enter_contextAs   zExitStack.enter_contextcCs|jddddS)z$Immediately unwind the context stackN)r)r r r rr:NszExitStack.closec s|ddk }tjdfdd}d}d}x\|jr|jj}y||rTd}d}d}Wq.tj}||d|dd}|}Yq.Xq.W|ry|dj}|dWn tk r||d_YnX|o|S)Nrr1cs8x,|j}||krdS|dks$|kr&P|}qW||_dS)N) __context__)new_excold_exc exc_context) frame_excr r_fix_exception_contextXsz2ExitStack.__exit__.._fix_exception_contextFT)NNN)r4r5rKrBr` BaseException) r rN received_excresuppressed_exc pending_raisecbnew_exc_details fixed_ctxr )rdrrRs2       zExitStack.__exit__N) rrrrr,rMrTrSrZr_r:rr r r rrs   )rrr4r collectionsr functoolsr__all__ABCrobjectrr'rrr;r r r rr r r rs$  I"