@@ -43,6 +43,7 @@ def __init__(self, gen, func):
4343 assert inspect .isgenerator (gen ), gen
4444 self .gen = gen
4545 self .func = func
46+ self ._source_traceback = traceback .extract_stack (sys ._getframe (1 ))
4647
4748 def __iter__ (self ):
4849 return self
@@ -81,13 +82,13 @@ def __del__(self):
8182 gen = getattr (self , 'gen' , None )
8283 frame = getattr (gen , 'gi_frame' , None )
8384 if frame is not None and frame .f_lasti == - 1 :
84- func = self .func
85- code = func . __code__
86- filename = code . co_filename
87- lineno = code . co_firstlineno
88- logger . error (
89- 'Coroutine %r defined at %s:%s was never yielded from' ,
90- func . __name__ , filename , lineno )
85+ func = events . _format_callback ( self .func , ())
86+ tb = '' . join ( traceback . format_list ( self . _source_traceback ))
87+ message = ( 'Coroutine %s was never yielded from \n '
88+ 'Coroutine object created at (most recent call last): \n '
89+ '%s'
90+ % ( func , tb . rstrip ()))
91+ logger . error ( message )
9192
9293
9394def coroutine (func ):
@@ -112,6 +113,8 @@ def coro(*args, **kw):
112113 @functools .wraps (func )
113114 def wrapper (* args , ** kwds ):
114115 w = CoroWrapper (coro (* args , ** kwds ), func )
116+ if w ._source_traceback :
117+ del w ._source_traceback [- 1 ]
115118 w .__name__ = func .__name__
116119 if _PY35 :
117120 w .__qualname__ = func .__qualname__
0 commit comments