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:
Victor Stinner 2014-06-27 12:28:41 +02:00
parent c4cca45baf
commit bbd96c6f47
2 changed files with 42 additions and 7 deletions

View file

@ -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__