mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
asyncio, Tulip issue 137: In debug mode, add the traceback where the coroutine
object was created to the "coroutine ... was never yield from" log
This commit is contained in:
parent
c4cca45baf
commit
bbd96c6f47
2 changed files with 42 additions and 7 deletions
|
@ -43,6 +43,7 @@ class CoroWrapper:
|
|||
assert inspect.isgenerator(gen), gen
|
||||
self.gen = gen
|
||||
self.func = func
|
||||
self._source_traceback = traceback.extract_stack(sys._getframe(1))
|
||||
|
||||
def __iter__(self):
|
||||
return self
|
||||
|
@ -81,13 +82,13 @@ class CoroWrapper:
|
|||
gen = getattr(self, 'gen', None)
|
||||
frame = getattr(gen, 'gi_frame', None)
|
||||
if frame is not None and frame.f_lasti == -1:
|
||||
func = self.func
|
||||
code = func.__code__
|
||||
filename = code.co_filename
|
||||
lineno = code.co_firstlineno
|
||||
logger.error(
|
||||
'Coroutine %r defined at %s:%s was never yielded from',
|
||||
func.__name__, filename, lineno)
|
||||
func = events._format_callback(self.func, ())
|
||||
tb = ''.join(traceback.format_list(self._source_traceback))
|
||||
message = ('Coroutine %s was never yielded from\n'
|
||||
'Coroutine object created at (most recent call last):\n'
|
||||
'%s'
|
||||
% (func, tb.rstrip()))
|
||||
logger.error(message)
|
||||
|
||||
|
||||
def coroutine(func):
|
||||
|
@ -112,6 +113,8 @@ def coroutine(func):
|
|||
@functools.wraps(func)
|
||||
def wrapper(*args, **kwds):
|
||||
w = CoroWrapper(coro(*args, **kwds), func)
|
||||
if w._source_traceback:
|
||||
del w._source_traceback[-1]
|
||||
w.__name__ = func.__name__
|
||||
if _PY35:
|
||||
w.__qualname__ = func.__qualname__
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue