python (3.11.7)

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