asyncio: repr(Task) now also contains the line number even if the coroutine is

done: use the first line number of the code object instead of the current line
number of the generator frame.

The name of the coroutine is not enough because many coroutines may have the
same name. It's a common case in asyncio tests for example.
This commit is contained in:
Victor Stinner 2014-06-24 22:57:14 +02:00
parent 14199f9392
commit df29c4a83d
2 changed files with 8 additions and 4 deletions

View File

@ -208,9 +208,11 @@ class Task(futures.Future):
if iscoroutine(coro):
filename = coro.gi_code.co_filename
if coro.gi_frame is not None:
text += ' at %s:%s' % (filename, coro.gi_frame.f_lineno)
lineno = coro.gi_frame.f_lineno
text += ' at %s:%s' % (filename, lineno)
else:
text += ' done at %s' % filename
lineno = coro.gi_code.co_firstlineno
text += ' done at %s:%s' % (filename, lineno)
res = res[:i] + '(<{}>)'.format(text) + res[i:]
return res

View File

@ -148,12 +148,14 @@ class TaskTests(test_utils.TestCase):
self.assertRaises(asyncio.CancelledError,
self.loop.run_until_complete, t)
self.assertEqual(repr(t),
'Task(<notmuch done at %s>)<CANCELLED>' % filename)
'Task(<notmuch done at %s:%s>)<CANCELLED>'
% (filename, lineno))
t = asyncio.Task(notmuch(), loop=self.loop)
self.loop.run_until_complete(t)
self.assertEqual(repr(t),
"Task(<notmuch done at %s>)<result='abc'>" % filename)
"Task(<notmuch done at %s:%s>)<result='abc'>"
% (filename, lineno))
def test_task_repr_custom(self):
@asyncio.coroutine