states for future check for a future this returns true when obj is a future instance or is advertising itself as ducktype compatible by setting asynciofutureblocking see comment in future for more details helper function for future repr size lencb if not size cb def formatcbcallback return formathelpers formatcallbacksourcecallback if size 1 cb formatcbcb00 elif size 2 cb formatformatcbcb00 formatcbcb10 elif size 2 cb more formatformatcbcb00 size 2 formatcbcb10 return f cbcb def futurereprinfofuture future str use reprlib to limit the length of the output especially for very long strings states for future 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 helper function for future __repr__ future str helper function for future __repr__ use reprlib to limit the length of the output especially for very long strings
__all__ = ()

import reprlib

from . import format_helpers


_PENDING = 'PENDING'
_CANCELLED = 'CANCELLED'
_FINISHED = 'FINISHED'


def isfuture(obj):
    
    return (hasattr(obj.__class__, '_asyncio_future_blocking') and
            obj._asyncio_future_blocking is not None)


def _format_callbacks(cb):
    
    size = len(cb)
    if not size:
        cb = ''

    def format_cb(callback):
        return format_helpers._format_callback_source(callback, ())

    if size == 1:
        cb = format_cb(cb[0][0])
    elif size == 2:
        cb = '{}, {}'.format(format_cb(cb[0][0]), format_cb(cb[1][0]))
    elif size > 2:
        cb = '{}, <{} more>, {}'.format(format_cb(cb[0][0]),
                                        size - 2,
                                        format_cb(cb[-1][0]))
    return f'cb=[{cb}]'


def _future_repr_info(future):
    
    
    info = [future._state.lower()]
    if future._state == _FINISHED:
        if future._exception is not None:
            info.append(f'exception={future._exception!r}')
        else:
            
            
            result = reprlib.repr(future._result)
            info.append(f'result={result}')
    if future._callbacks:
        info.append(_format_callbacks(future._callbacks))
    if future._source_traceback:
        frame = future._source_traceback[-1]
        info.append(f'created at {frame[0]}:{frame[1]}')
    return info


@reprlib.recursive_repr()
def _future_repr(future):
    info = ' '.join(_future_repr_info(future))
    return f'<{future.__class__.__name__} {info}>'