mirror of
https://github.com/python/cpython.git
synced 2025-07-08 03:45:36 +00:00
asyncio: sync with Tulip
- repr(Task) and repr(CoroWrapper) now also includes where these objects were created. If the coroutine is not a generator (don't use "yield from"), use the location of the function, not the location of the coro() wrapper. - Fix create_task(): truncate the traceback to hide the call to create_task().
This commit is contained in:
parent
f68bd88aa6
commit
c39ba7d611
4 changed files with 70 additions and 15 deletions
|
@ -57,7 +57,7 @@ del has_yield_from_bug
|
|||
|
||||
|
||||
class CoroWrapper:
|
||||
# Wrapper for coroutine in _DEBUG mode.
|
||||
# Wrapper for coroutine object in _DEBUG mode.
|
||||
|
||||
def __init__(self, gen, func):
|
||||
assert inspect.isgenerator(gen), gen
|
||||
|
@ -68,8 +68,11 @@ class CoroWrapper:
|
|||
# decorator
|
||||
|
||||
def __repr__(self):
|
||||
return ('<%s %s>'
|
||||
% (self.__class__.__name__, _format_coroutine(self)))
|
||||
coro_repr = _format_coroutine(self)
|
||||
if self._source_traceback:
|
||||
frame = self._source_traceback[-1]
|
||||
coro_repr += ', created at %s:%s' % (frame[0], frame[1])
|
||||
return '<%s %s>' % (self.__class__.__name__, coro_repr)
|
||||
|
||||
def __iter__(self):
|
||||
return self
|
||||
|
@ -181,9 +184,18 @@ def _format_coroutine(coro):
|
|||
coro_name = coro.__name__
|
||||
|
||||
filename = coro.gi_code.co_filename
|
||||
if coro.gi_frame is not None:
|
||||
if (isinstance(coro, CoroWrapper)
|
||||
and not inspect.isgeneratorfunction(coro.func)):
|
||||
filename, lineno = events._get_function_source(coro.func)
|
||||
if coro.gi_frame is None:
|
||||
coro_repr = '%s() done, defined at %s:%s' % (coro_name, filename, lineno)
|
||||
else:
|
||||
coro_repr = '%s() running, defined at %s:%s' % (coro_name, filename, lineno)
|
||||
elif coro.gi_frame is not None:
|
||||
lineno = coro.gi_frame.f_lineno
|
||||
return '%s() at %s:%s' % (coro_name, filename, lineno)
|
||||
coro_repr = '%s() running at %s:%s' % (coro_name, filename, lineno)
|
||||
else:
|
||||
lineno = coro.gi_code.co_firstlineno
|
||||
return '%s() done at %s:%s' % (coro_name, filename, lineno)
|
||||
coro_repr = '%s() done, defined at %s:%s' % (coro_name, filename, lineno)
|
||||
|
||||
return coro_repr
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue