17db96d56Sopenharmony_ci__all__ = () 27db96d56Sopenharmony_ci 37db96d56Sopenharmony_ciimport reprlib 47db96d56Sopenharmony_cifrom _thread import get_ident 57db96d56Sopenharmony_ci 67db96d56Sopenharmony_cifrom . import format_helpers 77db96d56Sopenharmony_ci 87db96d56Sopenharmony_ci# States for Future. 97db96d56Sopenharmony_ci_PENDING = 'PENDING' 107db96d56Sopenharmony_ci_CANCELLED = 'CANCELLED' 117db96d56Sopenharmony_ci_FINISHED = 'FINISHED' 127db96d56Sopenharmony_ci 137db96d56Sopenharmony_ci 147db96d56Sopenharmony_cidef isfuture(obj): 157db96d56Sopenharmony_ci """Check for a Future. 167db96d56Sopenharmony_ci 177db96d56Sopenharmony_ci This returns True when obj is a Future instance or is advertising 187db96d56Sopenharmony_ci itself as duck-type compatible by setting _asyncio_future_blocking. 197db96d56Sopenharmony_ci See comment in Future for more details. 207db96d56Sopenharmony_ci """ 217db96d56Sopenharmony_ci return (hasattr(obj.__class__, '_asyncio_future_blocking') and 227db96d56Sopenharmony_ci obj._asyncio_future_blocking is not None) 237db96d56Sopenharmony_ci 247db96d56Sopenharmony_ci 257db96d56Sopenharmony_cidef _format_callbacks(cb): 267db96d56Sopenharmony_ci """helper function for Future.__repr__""" 277db96d56Sopenharmony_ci size = len(cb) 287db96d56Sopenharmony_ci if not size: 297db96d56Sopenharmony_ci cb = '' 307db96d56Sopenharmony_ci 317db96d56Sopenharmony_ci def format_cb(callback): 327db96d56Sopenharmony_ci return format_helpers._format_callback_source(callback, ()) 337db96d56Sopenharmony_ci 347db96d56Sopenharmony_ci if size == 1: 357db96d56Sopenharmony_ci cb = format_cb(cb[0][0]) 367db96d56Sopenharmony_ci elif size == 2: 377db96d56Sopenharmony_ci cb = '{}, {}'.format(format_cb(cb[0][0]), format_cb(cb[1][0])) 387db96d56Sopenharmony_ci elif size > 2: 397db96d56Sopenharmony_ci cb = '{}, <{} more>, {}'.format(format_cb(cb[0][0]), 407db96d56Sopenharmony_ci size - 2, 417db96d56Sopenharmony_ci format_cb(cb[-1][0])) 427db96d56Sopenharmony_ci return f'cb=[{cb}]' 437db96d56Sopenharmony_ci 447db96d56Sopenharmony_ci 457db96d56Sopenharmony_cidef _future_repr_info(future): 467db96d56Sopenharmony_ci # (Future) -> str 477db96d56Sopenharmony_ci """helper function for Future.__repr__""" 487db96d56Sopenharmony_ci info = [future._state.lower()] 497db96d56Sopenharmony_ci if future._state == _FINISHED: 507db96d56Sopenharmony_ci if future._exception is not None: 517db96d56Sopenharmony_ci info.append(f'exception={future._exception!r}') 527db96d56Sopenharmony_ci else: 537db96d56Sopenharmony_ci # use reprlib to limit the length of the output, especially 547db96d56Sopenharmony_ci # for very long strings 557db96d56Sopenharmony_ci result = reprlib.repr(future._result) 567db96d56Sopenharmony_ci info.append(f'result={result}') 577db96d56Sopenharmony_ci if future._callbacks: 587db96d56Sopenharmony_ci info.append(_format_callbacks(future._callbacks)) 597db96d56Sopenharmony_ci if future._source_traceback: 607db96d56Sopenharmony_ci frame = future._source_traceback[-1] 617db96d56Sopenharmony_ci info.append(f'created at {frame[0]}:{frame[1]}') 627db96d56Sopenharmony_ci return info 637db96d56Sopenharmony_ci 647db96d56Sopenharmony_ci 657db96d56Sopenharmony_ci@reprlib.recursive_repr() 667db96d56Sopenharmony_cidef _future_repr(future): 677db96d56Sopenharmony_ci info = ' '.join(_future_repr_info(future)) 687db96d56Sopenharmony_ci return f'<{future.__class__.__name__} {info}>' 69