Issue #28372: Fix asyncio to support formatting of non-python coroutines
This commit is contained in:
parent
0de3de6cbf
commit
8dc3e43839
|
@ -261,6 +261,25 @@ def iscoroutine(obj):
|
|||
def _format_coroutine(coro):
|
||||
assert iscoroutine(coro)
|
||||
|
||||
if not hasattr(coro, 'cr_code') and not hasattr(coro, 'gi_code'):
|
||||
# Most likely a Cython coroutine.
|
||||
coro_name = getattr(coro, '__qualname__', coro.__name__)
|
||||
coro_name = '{}()'.format(coro_name)
|
||||
|
||||
running = False
|
||||
try:
|
||||
running = coro.cr_running
|
||||
except AttributeError:
|
||||
try:
|
||||
running = coro.gi_running
|
||||
except AttributeError:
|
||||
pass
|
||||
|
||||
if running:
|
||||
return '{} running'.format(coro_name)
|
||||
else:
|
||||
return coro_name
|
||||
|
||||
coro_name = None
|
||||
if isinstance(coro, CoroWrapper):
|
||||
func = coro.func
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
"""Tests for events.py."""
|
||||
|
||||
import collections.abc
|
||||
import functools
|
||||
import gc
|
||||
import io
|
||||
|
@ -25,6 +26,7 @@ if sys.platform != 'win32':
|
|||
import tty
|
||||
|
||||
import asyncio
|
||||
from asyncio import coroutines
|
||||
from asyncio import proactor_events
|
||||
from asyncio import selector_events
|
||||
from asyncio import sslproto
|
||||
|
@ -2380,6 +2382,38 @@ class HandleTests(test_utils.TestCase):
|
|||
h = loop.call_later(0, noop)
|
||||
check_source_traceback(h)
|
||||
|
||||
@unittest.skipUnless(hasattr(collections.abc, 'Coroutine'),
|
||||
'No collections.abc.Coroutine')
|
||||
def test_coroutine_like_object_debug_formatting(self):
|
||||
# Test that asyncio can format coroutines that are instances of
|
||||
# collections.abc.Coroutine, but lack cr_core or gi_code attributes
|
||||
# (such as ones compiled with Cython).
|
||||
|
||||
class Coro:
|
||||
__name__ = 'AAA'
|
||||
|
||||
def send(self, v):
|
||||
pass
|
||||
|
||||
def throw(self, *exc):
|
||||
pass
|
||||
|
||||
def close(self):
|
||||
pass
|
||||
|
||||
def __await__(self):
|
||||
pass
|
||||
|
||||
coro = Coro()
|
||||
self.assertTrue(asyncio.iscoroutine(coro))
|
||||
self.assertEqual(coroutines._format_coroutine(coro), 'AAA()')
|
||||
|
||||
coro.__qualname__ = 'BBB'
|
||||
self.assertEqual(coroutines._format_coroutine(coro), 'BBB()')
|
||||
|
||||
coro.cr_running = True
|
||||
self.assertEqual(coroutines._format_coroutine(coro), 'BBB() running')
|
||||
|
||||
|
||||
class TimerTests(unittest.TestCase):
|
||||
|
||||
|
|
Loading…
Reference in New Issue