blob: bd65beec553cbcec684cec0e698860d6db91edb2 [file] [log] [blame]
Yury Selivanov6370f342017-12-10 18:36:12 -05001__all__ = ()
Yury Selivanova0c1ba62016-10-28 12:52:37 -04002
jhaydaman0a28c0d2018-05-30 02:15:06 -05003import concurrent.futures
Yury Selivanova0c1ba62016-10-28 12:52:37 -04004import reprlib
5
Andrew Svetlovf74ef452017-12-15 07:04:38 +02006from . import format_helpers
Yury Selivanova0c1ba62016-10-28 12:52:37 -04007
Yury Selivanova0c1ba62016-10-28 12:52:37 -04008CancelledError = concurrent.futures.CancelledError
9TimeoutError = concurrent.futures.TimeoutError
jhaydaman0a28c0d2018-05-30 02:15:06 -050010InvalidStateError = concurrent.futures.InvalidStateError
Yury Selivanova0c1ba62016-10-28 12:52:37 -040011
12
13# States for Future.
14_PENDING = 'PENDING'
15_CANCELLED = 'CANCELLED'
16_FINISHED = 'FINISHED'
17
18
19def isfuture(obj):
20 """Check for a Future.
21
22 This returns True when obj is a Future instance or is advertising
23 itself as duck-type compatible by setting _asyncio_future_blocking.
24 See comment in Future for more details.
25 """
Yury Selivanov6130c022016-11-07 16:07:30 -050026 return (hasattr(obj.__class__, '_asyncio_future_blocking') and
27 obj._asyncio_future_blocking is not None)
Yury Selivanova0c1ba62016-10-28 12:52:37 -040028
29
30def _format_callbacks(cb):
31 """helper function for Future.__repr__"""
32 size = len(cb)
33 if not size:
34 cb = ''
35
36 def format_cb(callback):
Andrew Svetlovf74ef452017-12-15 07:04:38 +020037 return format_helpers._format_callback_source(callback, ())
Yury Selivanova0c1ba62016-10-28 12:52:37 -040038
39 if size == 1:
Yury Selivanovf23746a2018-01-22 19:11:18 -050040 cb = format_cb(cb[0][0])
Yury Selivanova0c1ba62016-10-28 12:52:37 -040041 elif size == 2:
Yury Selivanovf23746a2018-01-22 19:11:18 -050042 cb = '{}, {}'.format(format_cb(cb[0][0]), format_cb(cb[1][0]))
Yury Selivanova0c1ba62016-10-28 12:52:37 -040043 elif size > 2:
Yury Selivanovf23746a2018-01-22 19:11:18 -050044 cb = '{}, <{} more>, {}'.format(format_cb(cb[0][0]),
Yury Selivanova0c1ba62016-10-28 12:52:37 -040045 size - 2,
Yury Selivanovf23746a2018-01-22 19:11:18 -050046 format_cb(cb[-1][0]))
Yury Selivanov6370f342017-12-10 18:36:12 -050047 return f'cb=[{cb}]'
Yury Selivanova0c1ba62016-10-28 12:52:37 -040048
49
50def _future_repr_info(future):
51 # (Future) -> str
52 """helper function for Future.__repr__"""
53 info = [future._state.lower()]
54 if future._state == _FINISHED:
55 if future._exception is not None:
Yury Selivanov6370f342017-12-10 18:36:12 -050056 info.append(f'exception={future._exception!r}')
Yury Selivanova0c1ba62016-10-28 12:52:37 -040057 else:
58 # use reprlib to limit the length of the output, especially
59 # for very long strings
60 result = reprlib.repr(future._result)
Yury Selivanov6370f342017-12-10 18:36:12 -050061 info.append(f'result={result}')
Yury Selivanova0c1ba62016-10-28 12:52:37 -040062 if future._callbacks:
63 info.append(_format_callbacks(future._callbacks))
64 if future._source_traceback:
65 frame = future._source_traceback[-1]
Yury Selivanov6370f342017-12-10 18:36:12 -050066 info.append(f'created at {frame[0]}:{frame[1]}')
Yury Selivanova0c1ba62016-10-28 12:52:37 -040067 return info