| __all__ = [] |
| |
| import concurrent.futures._base |
| import reprlib |
| |
| from . import events |
| |
| Error = concurrent.futures._base.Error |
| CancelledError = concurrent.futures.CancelledError |
| TimeoutError = concurrent.futures.TimeoutError |
| |
| |
| class InvalidStateError(Error): |
| """The operation is not allowed in this state.""" |
| |
| |
| # States for Future. |
| _PENDING = 'PENDING' |
| _CANCELLED = 'CANCELLED' |
| _FINISHED = 'FINISHED' |
| |
| |
| def isfuture(obj): |
| """Check for a Future. |
| |
| This returns True when obj is a Future instance or is advertising |
| itself as duck-type compatible by setting _asyncio_future_blocking. |
| See comment in Future for more details. |
| """ |
| return (hasattr(obj.__class__, '_asyncio_future_blocking') and |
| obj._asyncio_future_blocking is not None) |
| |
| |
| def _format_callbacks(cb): |
| """helper function for Future.__repr__""" |
| size = len(cb) |
| if not size: |
| cb = '' |
| |
| def format_cb(callback): |
| return events._format_callback_source(callback, ()) |
| |
| if size == 1: |
| cb = format_cb(cb[0]) |
| elif size == 2: |
| cb = '{}, {}'.format(format_cb(cb[0]), format_cb(cb[1])) |
| elif size > 2: |
| cb = '{}, <{} more>, {}'.format(format_cb(cb[0]), |
| size - 2, |
| format_cb(cb[-1])) |
| return 'cb=[%s]' % cb |
| |
| |
| def _future_repr_info(future): |
| # (Future) -> str |
| """helper function for Future.__repr__""" |
| info = [future._state.lower()] |
| if future._state == _FINISHED: |
| if future._exception is not None: |
| info.append('exception={!r}'.format(future._exception)) |
| else: |
| # use reprlib to limit the length of the output, especially |
| # for very long strings |
| result = reprlib.repr(future._result) |
| info.append('result={}'.format(result)) |
| if future._callbacks: |
| info.append(_format_callbacks(future._callbacks)) |
| if future._source_traceback: |
| frame = future._source_traceback[-1] |
| info.append('created at %s:%s' % (frame[0], frame[1])) |
| return info |