U e5db3ã@södZddlZddlZddlZddlZddlmZddlmZddlm Z ddlm Z ej Z ej Z ej Z ejZejdZGdd „d ƒZeZd d „Zd d „Zdd„Zdd„Zdd„Zdd„Zddœdd„Zz ddlZWnek ræYn XejZZdS))ÚFutureÚ wrap_futureÚisfutureéNé)Ú base_futures)Úevents)Ú exceptions)Úformat_helpersc@sÐeZdZeZdZdZdZdZdZ dZ ddœdd„Z e j Zdd„Zdd „Zed d „ƒZejd d „ƒZd d„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zddœdd„Zdd„Zd d!„Zd"d#„Zd$d%„ZeZ dS)&rNF©ÚloopcCs@|dkrt ¡|_n||_g|_|j ¡rú )ÚformatÚ __class__Ú__name__ÚjoinÚ _repr_info©rrrrÚ__repr__Vs  ÿzFuture.__repr__cCsF|js dS|j}|jj›d�||dœ}|jr6|j|d<|j |¡dS)Nz exception was never retrieved)ÚmessageÚ exceptionÚfutureZsource_traceback)Ú_Future__log_tracebackÚ _exceptionrrrr Zcall_exception_handler)rÚexcÚcontextrrrÚ__del__Zs ü zFuture.__del__cCs|jS©N)r#rrrrÚ_log_tracebackjszFuture._log_tracebackcCst|ƒrtdƒ‚d|_dS)Nz'_log_traceback can only be set to FalseF)ÚboolÚ ValueErrorr#)rÚvalrrrr)nscCs|j}|dkrtdƒ‚|S)Nz!Future object is not initialized.)r Ú RuntimeErrorrrrrÚget_looptszFuture.get_loopcCs&d|_|jtkrdSt|_| ¡dS)NFT)r#Ú_stateÚ_PENDINGÚ _CANCELLEDÚ_Future__schedule_callbacksrrrrÚcancel{s  z Future.cancelcCsH|jdd…}|sdSg|jdd…<|D]\}}|jj|||d�q(dS©N©r&)rr Ú call_soon)rZ callbacksÚcallbackÚctxrrrZ__schedule_callbacks‰s  zFuture.__schedule_callbackscCs |jtkSr()r/r1rrrrÚ cancelled—szFuture.cancelledcCs |jtkSr()r/r0rrrrÚdone�sz Future.donecCs@|jtkrtj‚|jtkr$t d¡‚d|_|jdk r:|j‚|jS)NzResult is not ready.F) r/r1rÚCancelledErrorÚ _FINISHEDÚInvalidStateErrorr#r$Ú_resultrrrrÚresult¥s    z Future.resultcCs0|jtkrtj‚|jtkr$t d¡‚d|_|jS)NzException is not set.F)r/r1rr;r<r=r#r$rrrrr!µs    zFuture.exceptionr5cCsB|jtkr|jj|||d�n |dkr.t ¡}|j ||f¡dSr4)r/r0r r6Ú contextvarsZ copy_contextrÚappend)rÚfnr&rrrÚadd_done_callbackÄs  zFuture.add_done_callbackcs<‡fdd„|jDƒ}t|jƒt|ƒ}|r8||jdd…<|S)Ncs g|]\}}|ˆkr||f‘qSrr)Ú.0Úfr8©rBrrÚ Ùsþz/Future.remove_done_callback..)rÚlen)rrBZfiltered_callbacksZ removed_countrrFrÚremove_done_callbackÔs ÿzFuture.remove_done_callbackcCs8|jtkr t |j›d|›�¡‚||_t|_| ¡dS)Nú: )r/r0rr=r>r<r2)rr?rrrÚ set_resultãs  zFuture.set_resultcCsb|jtkr t |j›d|›�¡‚t|tƒr0|ƒ}t|ƒtkrDtdƒ‚||_t |_|  ¡d|_ dS)NrJzPStopIteration interacts badly with generators and cannot be raised into a FutureT) r/r0rr=Ú isinstanceÚtypeÚ StopIterationÚ TypeErrorr$r<r2r#)rr!rrrÚ set_exceptionïs   zFuture.set_exceptionccs,| ¡sd|_|V| ¡s$tdƒ‚| ¡S)NTzawait wasn't used with future)r:Ú_asyncio_future_blockingr-r?rrrrÚ __await__s zFuture.__await__)!rÚ __module__Ú __qualname__r0r/r>r$r rrQr#rrZ_future_repr_inforrr'Úpropertyr)Úsetterr.r3r2r9r:r?r!rCrIrKrPrRÚ__iter__rrrrrs8    rcCs,z |j}Wntk rYnX|ƒS|jSr()r.ÚAttributeErrorr )Úfutr.rrrÚ _get_loops  rZcCs| ¡r dS| |¡dSr()r9rK)rYr?rrrÚ_set_result_unless_cancelledsr[cCsXt|ƒ}|tjjkr tj|jŽS|tjjkr8tj|jŽS|tjjkrPtj|jŽS|SdSr()rMÚ concurrentÚfuturesr;rÚargsÚ TimeoutErrorr=)r%Z exc_classrrrÚ_convert_future_exc#s      r`cCsR| ¡r| ¡| ¡sdS| ¡}|dk r<| t|ƒ¡n| ¡}| |¡dSr()r9r3Zset_running_or_notify_cancelr!rPr`r?rK)r\Úsourcer!r?rrrÚ_set_concurrent_future_state/srbcCsT| ¡r dS| ¡r| ¡n2| ¡}|dk r>| t|ƒ¡n| ¡}| |¡dSr()r9r3r!rPr`r?rK)raÚdestr!r?rrrÚ_copy_future_state>s rdcs¦tˆƒstˆtjjƒstdƒ‚tˆƒs._set_statecs2| ¡r.ˆdksˆˆkr"ˆ ¡n ˆ ˆj¡dSr()r9r3Úcall_soon_threadsafe)Ú destination)Ú dest_loopraÚ source_looprrÚ_call_check_cancelhs z)_chain_future.._call_check_cancelcsJˆ ¡rˆdk rˆ ¡rdSˆdks,ˆˆkr8ˆˆ|ƒnˆ ˆˆ|¡dSr()r9Z is_closedrg)ra)rfrirhrjrrÚ_call_set_stateosÿÿ z&_chain_future.._call_set_state)rrLr\r]rrOrZrC)rarhrkrlr)rfrirhrarjrÚ _chain_futureRs ÿ ÿ rmr cCs2t|ƒr |S|dkrt ¡}| ¡}t||ƒ|Sr()rrr Z create_futurerm)r"r Z new_futurerrrr|s r)Ú__all__Zconcurrent.futuresr\r@ZloggingrÚrrrr rr0r1r<ÚDEBUGZ STACK_DEBUGrZ _PyFuturerZr[r`rbrdrmrZ_asyncioÚ ImportErrorZ_CFuturerrrrÚs8     q  *