1*cda5da8dSAndroid Build Coastguard Worker__all__ = () 2*cda5da8dSAndroid Build Coastguard Worker 3*cda5da8dSAndroid Build Coastguard Workerimport reprlib 4*cda5da8dSAndroid Build Coastguard Workerfrom _thread import get_ident 5*cda5da8dSAndroid Build Coastguard Worker 6*cda5da8dSAndroid Build Coastguard Workerfrom . import format_helpers 7*cda5da8dSAndroid Build Coastguard Worker 8*cda5da8dSAndroid Build Coastguard Worker# States for Future. 9*cda5da8dSAndroid Build Coastguard Worker_PENDING = 'PENDING' 10*cda5da8dSAndroid Build Coastguard Worker_CANCELLED = 'CANCELLED' 11*cda5da8dSAndroid Build Coastguard Worker_FINISHED = 'FINISHED' 12*cda5da8dSAndroid Build Coastguard Worker 13*cda5da8dSAndroid Build Coastguard Worker 14*cda5da8dSAndroid Build Coastguard Workerdef isfuture(obj): 15*cda5da8dSAndroid Build Coastguard Worker """Check for a Future. 16*cda5da8dSAndroid Build Coastguard Worker 17*cda5da8dSAndroid Build Coastguard Worker This returns True when obj is a Future instance or is advertising 18*cda5da8dSAndroid Build Coastguard Worker itself as duck-type compatible by setting _asyncio_future_blocking. 19*cda5da8dSAndroid Build Coastguard Worker See comment in Future for more details. 20*cda5da8dSAndroid Build Coastguard Worker """ 21*cda5da8dSAndroid Build Coastguard Worker return (hasattr(obj.__class__, '_asyncio_future_blocking') and 22*cda5da8dSAndroid Build Coastguard Worker obj._asyncio_future_blocking is not None) 23*cda5da8dSAndroid Build Coastguard Worker 24*cda5da8dSAndroid Build Coastguard Worker 25*cda5da8dSAndroid Build Coastguard Workerdef _format_callbacks(cb): 26*cda5da8dSAndroid Build Coastguard Worker """helper function for Future.__repr__""" 27*cda5da8dSAndroid Build Coastguard Worker size = len(cb) 28*cda5da8dSAndroid Build Coastguard Worker if not size: 29*cda5da8dSAndroid Build Coastguard Worker cb = '' 30*cda5da8dSAndroid Build Coastguard Worker 31*cda5da8dSAndroid Build Coastguard Worker def format_cb(callback): 32*cda5da8dSAndroid Build Coastguard Worker return format_helpers._format_callback_source(callback, ()) 33*cda5da8dSAndroid Build Coastguard Worker 34*cda5da8dSAndroid Build Coastguard Worker if size == 1: 35*cda5da8dSAndroid Build Coastguard Worker cb = format_cb(cb[0][0]) 36*cda5da8dSAndroid Build Coastguard Worker elif size == 2: 37*cda5da8dSAndroid Build Coastguard Worker cb = '{}, {}'.format(format_cb(cb[0][0]), format_cb(cb[1][0])) 38*cda5da8dSAndroid Build Coastguard Worker elif size > 2: 39*cda5da8dSAndroid Build Coastguard Worker cb = '{}, <{} more>, {}'.format(format_cb(cb[0][0]), 40*cda5da8dSAndroid Build Coastguard Worker size - 2, 41*cda5da8dSAndroid Build Coastguard Worker format_cb(cb[-1][0])) 42*cda5da8dSAndroid Build Coastguard Worker return f'cb=[{cb}]' 43*cda5da8dSAndroid Build Coastguard Worker 44*cda5da8dSAndroid Build Coastguard Worker 45*cda5da8dSAndroid Build Coastguard Workerdef _future_repr_info(future): 46*cda5da8dSAndroid Build Coastguard Worker # (Future) -> str 47*cda5da8dSAndroid Build Coastguard Worker """helper function for Future.__repr__""" 48*cda5da8dSAndroid Build Coastguard Worker info = [future._state.lower()] 49*cda5da8dSAndroid Build Coastguard Worker if future._state == _FINISHED: 50*cda5da8dSAndroid Build Coastguard Worker if future._exception is not None: 51*cda5da8dSAndroid Build Coastguard Worker info.append(f'exception={future._exception!r}') 52*cda5da8dSAndroid Build Coastguard Worker else: 53*cda5da8dSAndroid Build Coastguard Worker # use reprlib to limit the length of the output, especially 54*cda5da8dSAndroid Build Coastguard Worker # for very long strings 55*cda5da8dSAndroid Build Coastguard Worker result = reprlib.repr(future._result) 56*cda5da8dSAndroid Build Coastguard Worker info.append(f'result={result}') 57*cda5da8dSAndroid Build Coastguard Worker if future._callbacks: 58*cda5da8dSAndroid Build Coastguard Worker info.append(_format_callbacks(future._callbacks)) 59*cda5da8dSAndroid Build Coastguard Worker if future._source_traceback: 60*cda5da8dSAndroid Build Coastguard Worker frame = future._source_traceback[-1] 61*cda5da8dSAndroid Build Coastguard Worker info.append(f'created at {frame[0]}:{frame[1]}') 62*cda5da8dSAndroid Build Coastguard Worker return info 63*cda5da8dSAndroid Build Coastguard Worker 64*cda5da8dSAndroid Build Coastguard Worker 65*cda5da8dSAndroid Build Coastguard Worker@reprlib.recursive_repr() 66*cda5da8dSAndroid Build Coastguard Workerdef _future_repr(future): 67*cda5da8dSAndroid Build Coastguard Worker info = ' '.join(_future_repr_info(future)) 68*cda5da8dSAndroid Build Coastguard Worker return f'<{future.__class__.__name__} {info}>' 69