grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026U iÛf£aã @sjdZddlZddlZddlZddlmZddlmZddlm Z dddd d d d d ddddg Z Gdd „d ej ƒZ Gdd „d ej ƒZ Gdd „d eƒZGdd„dƒZGdd„dee eƒZGdd„dee ƒZdd„Zdd„ZGdd„de ƒZGdd„de ƒZGd d„deƒZGd!d„deƒZGd"d„de ƒZGd#d$„d$ƒZGd%d„dee ƒZGd&d „d ee ƒZGd'd „d e ƒZdS)(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@s2eZdZdZdd„Zejdd„ƒZedd„ƒZ dS) r z,An abstract base class for context managers.cCs|S©z0Return `self` upon entering the runtime context.©©Úselfrrú//opt/alt/python38/lib64/python3.8/contextlib.pyÚ __enter__sz AbstractContextManager.__enter__cCsdS©z9Raise any exception triggered within the runtime context.Nr©rÚexc_typeÚ exc_valueÚ tracebackrrrÚ__exit__szAbstractContextManager.__exit__cCs|tkrt |dd¡StS)Nrr)r Ú_collections_abcÚ_check_methodsÚNotImplemented©ÚclsÚCrrrÚ__subclasshook__sz'AbstractContextManager.__subclasshook__N) Ú__name__Ú __module__Ú __qualname__Ú__doc__rÚabcÚabstractmethodrÚ classmethodr%rrrrr s  c@s2eZdZdZdd„Zejdd„ƒZedd„ƒZ dS) r z9An abstract base class for asynchronous context managers.cÃs|SrrrrrrÚ __aenter__'sz&AbstractAsyncContextManager.__aenter__cÃsdSrrrrrrÚ __aexit__+sz%AbstractAsyncContextManager.__aexit__cCs|tkrt |dd¡StS)Nr-r.)r rr r!r"rrrr%0s ÿz,AbstractAsyncContextManager.__subclasshook__N) r&r'r(r)r-r*r+r.r,r%rrrrr #s  c@s eZdZdZdd„Zdd„ZdS)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. rrrrrÚ _recreate_cm;s zContextDecorator._recreate_cmcstˆƒ‡‡fdd„ƒ}|S)Nc s*ˆ ¡�ˆ||ŽW5QR£SQRXdS©N)r/©ÚargsÚkwds©ÚfuncrrrÚinnerHs z(ContextDecorator.__call__..innerr)rr5r6rr4rÚ__call__GszContextDecorator.__call__N)r&r'r(r)r/r7rrrrr8s c@seZdZdZdd„ZdS)Ú_GeneratorContextManagerBasezBShared functionality for @contextmanager and @asynccontextmanager.cCsJ|||Ž|_||||_|_|_t|ddƒ}|dkr@t|ƒj}||_dS)Nr))Úgenr5r2r3ÚgetattrÚtyper))rr5r2r3ÚdocrrrÚ__init__Rs    z%_GeneratorContextManagerBase.__init__N)r&r'r(r)r=rrrrr8Osr8c@s(eZdZdZdd„Zdd„Zdd„ZdS) Ú_GeneratorContextManagerz%Helper for @contextmanager decorator.cCs| |j|j|j¡Sr0)Ú __class__r5r2r3rrrrr/fsz%_GeneratorContextManager._recreate_cmcCs<|`|`|`z t|jƒWStk r6tdƒd‚YnXdS©Nzgenerator didn't yield)r2r3r5Únextr9Ú StopIterationÚ RuntimeErrorrrrrrls   z"_GeneratorContextManager.__enter__c Cs|dkr8zt|jƒWntk r,YdSXtdƒ‚nÌ|dkrF|ƒ}z|j |||¡Wn tk rˆ}z||k WY¢Sd}~XYnttk rØ}z4||krªWY¢&dS|tkrÆ|j|krÆWY¢ dS‚W5d}~XYn$t ¡d|krôYdS‚YnXtdƒ‚dS)NFúgenerator didn't stopéz#generator didn't stop after throw())rAr9rBrCÚthrowÚ __cause__ÚsysÚexc_info)rr;ÚvaluerÚexcrrrrus.    z!_GeneratorContextManager.__exit__N)r&r'r(r)r/rrrrrrr>as r>c@s eZdZdZdd„Zdd„ZdS)Ú_AsyncGeneratorContextManagerz Helper for @asynccontextmanager.cÃs6z|j ¡IdHWStk r0tdƒd‚YnXdSr@)r9Ú __anext__ÚStopAsyncIterationrCrrrrr-©sz(_AsyncGeneratorContextManager.__aenter__c Ãs&|dkr>z|j ¡IdHWntk r2YdSXtdƒ‚nä|dkrL|ƒ}z"|j |||¡IdHtdƒ‚Wn²tk rœ}z||k WY¢Sd}~XYn†tk rò}z:||kr¾WY¢,dSt|ttfƒrà|j|kràWY¢ dS‚W5d}~XYn0tk �r }z||k �r‚W5d}~XYnXdS)NrDz$generator didn't stop after athrow()F) r9rMrNrCÚathrowÚ isinstancerBrGÚ BaseException)rÚtyprJrrKrrrr.¯s.      z'_AsyncGeneratorContextManager.__aexit__N)r&r'r(r)r-r.rrrrrL¥srLcstˆƒ‡fdd„ƒ}|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ˆ||ƒSr0)r>r1©r5rrÚhelperîszcontextmanager..helperr©r5rTrrSrrÓscstˆƒ‡fdd„ƒ}|S)aý@asynccontextmanager decorator. Typical usage: @asynccontextmanager async def some_async_generator(): try: yield finally: This makes this: async with some_async_generator() as : equivalent to this: try: = finally: cs tˆ||ƒSr0)rLr1rSrrrTsz#asynccontextmanager..helperrrUrrSrrôsc@s(eZdZdZdd„Zdd„Zdd„ZdS) r a2Context 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 ||_dSr0©Úthing)rrWrrrr=&szclosing.__init__cCs|jSr0rVrrrrr(szclosing.__enter__cGs|j ¡dSr0)rWÚclose)rrIrrrr*szclosing.__exit__N©r&r'r(r)r=rrrrrrr sc@s(eZdZdZdd„Zdd„Zdd„ZdS)Ú_RedirectStreamNcCs||_g|_dSr0)Ú _new_targetÚ _old_targets)rÚ new_targetrrrr=2sz_RedirectStream.__init__cCs*|j tt|jƒ¡tt|j|jƒ|jSr0)r\Úappendr:rHÚ_streamÚsetattrr[rrrrr7sz_RedirectStream.__enter__cCstt|j|j ¡ƒdSr0)r`rHr_r\Úpop©rÚexctypeÚexcinstÚexctbrrrr<sz_RedirectStream.__exit__)r&r'r(r_r=rrrrrrrZ.srZc@seZdZdZdZdS)raAContext 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_rrrrr@s c@seZdZdZdZdS)rzCContext manager for temporarily redirecting stderr to another file.ÚstderrNrgrrrrrPsc@s(eZdZdZdd„Zdd„Zdd„ZdS) ra?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 ||_dSr0)Ú _exceptions)rÚ exceptionsrrrr=aszsuppress.__init__cCsdSr0rrrrrrdszsuppress.__enter__cCs|dk ot||jƒSr0)Ú issubclassrirbrrrrgs zsuppress.__exit__NrYrrrrrVs c@sheZdZdZedd„ƒZedd„ƒZdd„Zdd „Zd d „Z d d „Z dd„Z de _ dd„Z ddd„ZdS)Ú_BaseExitStackz.A base class for ExitStack and AsyncExitStack.cCs t||ƒSr0r©ÚcmÚcm_exitrrrÚ_create_exit_wrapperwsz#_BaseExitStack._create_exit_wrappercs‡‡‡fdd„}|S)NcsˆˆˆŽdSr0r©rrKÚtb©r2Úcallbackr3rrÚ _exit_wrapper}sz8_BaseExitStack._create_cb_wrapper.._exit_wrapperr©rtr2r3rurrsrÚ_create_cb_wrapper{sz!_BaseExitStack._create_cb_wrappercCs tƒ|_dSr0)rÚ_exit_callbacksrrrrr=�sz_BaseExitStack.__init__cCst|ƒƒ}|j|_tƒ|_|S)z@Preserve the context stack by transferring it to a new instance.)r;rxr)rÚ new_stackrrrÚpop_all„s z_BaseExitStack.pop_allcCsBt|ƒ}z |j}Wntk r0| |¡YnX| ||¡|S)aRegisters 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_methodrrrÚpush‹s   z_BaseExitStack.pushcCs(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;rrr}©rrnÚ_cm_typeÚ_exitÚresultrrrÚ enter_contextŸs   z_BaseExitStack.enter_contextcOs”t|ƒdkr|^}}}nV|s&tdƒ‚nHd|krZ| d¡}|^}}ddl}|jdtdd�ntdt|ƒd ƒ‚|j|f|ž|Ž}||_| |¡|S) z\Registers an arbitrary callback and arguments. Cannot suppress exceptions. ézBdescriptor 'callback' of '_BaseExitStack' object needs an argumentrtrNú4Passing 'callback' as keyword argument is deprecated©Ú stacklevelz8callback expected at least 1 positional argument, got %drE) ÚlenÚ TypeErrorraÚwarningsÚwarnÚDeprecationWarningrwÚ __wrapped__r|©r2r3rrtrŽrurrrrt­s&    ÿ ÿ z_BaseExitStack.callbackú#($self, callback, /, *args, **kwds)cCs| ||¡}| |d¡dS)z;Helper to correctly register callbacks to __exit__ methods.TN)rpr|©rrnrorurrrr}Ês z_BaseExitStack._push_cm_exitTcCs|j ||f¡dSr0)rxr^)rrtÚis_syncrrrr|Ïsz"_BaseExitStack._push_exit_callbackN)T)r&r'r(r)Ú staticmethodrprwr=rzr‚r‡rtÚ__text_signature__r}r|rrrrrlts  rlc@s(eZdZdZdd„Zdd„Zdd„ZdS) ra‹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. cCs|Sr0rrrrrrßszExitStack.__enter__c sÎ|ddk }t ¡d‰‡fdd„}d}d}|jrŠ|j ¡\}}z||ŽrVd}d}d}Wq,t ¡}||d|dƒd}|}Yq,Xq,|rÆz|dj} |d‚Wn tk rÄ| |d_‚YnX|oÌ|S)NrrEcs4|j}||krdS|dks*|ˆkr$q*|}q||_dSr0©Ú __context__©Únew_excÚold_excÚ exc_context©Ú frame_excrrÚ_fix_exception_contextèsz2ExitStack.__exit__.._fix_exception_contextFT©NNN©rHrIrxrar™rQ) rÚ exc_detailsÚ received_excr Úsuppressed_excÚ pending_raiser•ÚcbÚnew_exc_detailsÚ fixed_ctxrržrrâs2       zExitStack.__exit__cCs| ddd¡dS©z%Immediately unwind the context stack.N)rrrrrrXszExitStack.closeN)r&r'r(r)rrrXrrrrrÔs 1c@sfeZdZdZedd„ƒZedd„ƒZdd„Zdd „Zd d „Z d e _ d d„Z dd„Z dd„Z dd„ZdS)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. cCs t||ƒSr0rrmrrrÚ_create_async_exit_wrapper&sz)AsyncExitStack._create_async_exit_wrappercs‡‡‡fdd„}|S)Nc“sˆˆˆŽIdHdSr0rrqrsrrru,sz>AsyncExitStack._create_async_cb_wrapper.._exit_wrapperrrvrrsrÚ_create_async_cb_wrapper*sz'AsyncExitStack._create_async_cb_wrappercÃs.t|ƒ}|j}| |¡IdH}| ||¡|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ƒrrrÚenter_async_context0s  z"AsyncExitStack.enter_async_contextcCsDt|ƒ}z |j}Wn tk r2| |d¡YnX| ||¡|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~rrrÚpush_async_exit<s  zAsyncExitStack.push_async_exitcOs–t|ƒdkr|^}}}nV|s&tdƒ‚nHd|krZ| d¡}|^}}ddl}|jdtdd�ntdt|ƒ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 argumentrtrNr‰rŠzCpush_async_callback expected at least 1 positional argument, got %drEF) rŒr�rarŽr�r�r¬r‘r|r’rrrÚpush_async_callbackNs&    ÿ ÿ z"AsyncExitStack.push_async_callbackr“cÃs| ddd¡IdHdSrª)r.rrrrÚaclosekszAsyncExitStack.aclosecCs| ||¡}| |d¡dS)zLHelper to correctly register coroutine function to __aexit__ method.FN)r«r|r”rrrr­os z"AsyncExitStack._push_async_cm_exitcÃs|Sr0rrrrrr-uszAsyncExitStack.__aenter__c ‡sæ|ddk }t ¡d‰‡fdd„}d}d}|jr¢|j ¡\}}z0|rP||Ž}n||ŽIdH}|rnd}d}d}Wq,t ¡} || d|dƒd}| }Yq,Xq,|rÞz|dj} |d‚Wn tk rÜ| |d_‚YnX|oä|S)NrrEcs4|j}||krdS|dks*|ˆkr$q*|}q||_dSr0r˜ršržrrr ~sz8AsyncExitStack.__aexit__.._fix_exception_contextFTr¡r¢) rr£r¤r r¥r¦r•r§Ú cb_suppressr¨r©rržrr.xs8        zAsyncExitStack.__aexit__N)r&r'r(r)r–r«r¬r®r¯r°r—r±r­r-r.rrrrr s    c@s*eZdZdZd dd„Zdd„Zdd„ZdS) r aOContext 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 NcCs ||_dSr0©Ú enter_result)rr´rrrr=¹sznullcontext.__init__cCs|jSr0r³rrrrr¼sznullcontext.__enter__cGsdSr0r)rÚexcinforrrr¿sznullcontext.__exit__)NrYrrrrr ®s )r)r*rHrÚ collectionsrÚ functoolsrÚtypesrÚ__all__ÚABCr r Úobjectrr8r>rLrrr rZrrrrlrr r rrrrÚsN   ý þD ÿ.!!`E