blob: 22f298069c505edb192b030052e4c2ce7a2e70cc [file] [log] [blame]
Yury Selivanov6370f342017-12-10 18:36:12 -05001__all__ = ()
Yury Selivanova0c1ba62016-10-28 12:52:37 -04002
Yury Selivanova0c1ba62016-10-28 12:52:37 -04003import reprlib
4
Andrew Svetlovf74ef452017-12-15 07:04:38 +02005from . import format_helpers
Yury Selivanova0c1ba62016-10-28 12:52:37 -04006
Yury Selivanova0c1ba62016-10-28 12:52:37 -04007# States for Future.
8_PENDING = 'PENDING'
9_CANCELLED = 'CANCELLED'
10_FINISHED = 'FINISHED'
11
12
13def isfuture(obj):
14 """Check for a Future.
15
16 This returns True when obj is a Future instance or is advertising
17 itself as duck-type compatible by setting _asyncio_future_blocking.
18 See comment in Future for more details.
19 """
Yury Selivanov6130c022016-11-07 16:07:30 -050020 return (hasattr(obj.__class__, '_asyncio_future_blocking') and
21 obj._asyncio_future_blocking is not None)
Yury Selivanova0c1ba62016-10-28 12:52:37 -040022
23
24def _format_callbacks(cb):
25 """helper function for Future.__repr__"""
26 size = len(cb)
27 if not size:
28 cb = ''
29
30 def format_cb(callback):
Andrew Svetlovf74ef452017-12-15 07:04:38 +020031 return format_helpers._format_callback_source(callback, ())
Yury Selivanova0c1ba62016-10-28 12:52:37 -040032
33 if size == 1:
Yury Selivanovf23746a2018-01-22 19:11:18 -050034 cb = format_cb(cb[0][0])
Yury Selivanova0c1ba62016-10-28 12:52:37 -040035 elif size == 2:
Yury Selivanovf23746a2018-01-22 19:11:18 -050036 cb = '{}, {}'.format(format_cb(cb[0][0]), format_cb(cb[1][0]))
Yury Selivanova0c1ba62016-10-28 12:52:37 -040037 elif size > 2:
Yury Selivanovf23746a2018-01-22 19:11:18 -050038 cb = '{}, <{} more>, {}'.format(format_cb(cb[0][0]),
Yury Selivanova0c1ba62016-10-28 12:52:37 -040039 size - 2,
Yury Selivanovf23746a2018-01-22 19:11:18 -050040 format_cb(cb[-1][0]))
Yury Selivanov6370f342017-12-10 18:36:12 -050041 return f'cb=[{cb}]'
Yury Selivanova0c1ba62016-10-28 12:52:37 -040042
43
44def _future_repr_info(future):
45 # (Future) -> str
46 """helper function for Future.__repr__"""
47 info = [future._state.lower()]
48 if future._state == _FINISHED:
49 if future._exception is not None:
Yury Selivanov6370f342017-12-10 18:36:12 -050050 info.append(f'exception={future._exception!r}')
Yury Selivanova0c1ba62016-10-28 12:52:37 -040051 else:
52 # use reprlib to limit the length of the output, especially
53 # for very long strings
54 result = reprlib.repr(future._result)
Yury Selivanov6370f342017-12-10 18:36:12 -050055 info.append(f'result={result}')
Yury Selivanova0c1ba62016-10-28 12:52:37 -040056 if future._callbacks:
57 info.append(_format_callbacks(future._callbacks))
58 if future._source_traceback:
59 frame = future._source_traceback[-1]
Yury Selivanov6370f342017-12-10 18:36:12 -050060 info.append(f'created at {frame[0]}:{frame[1]}')
Yury Selivanova0c1ba62016-10-28 12:52:37 -040061 return info