mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
asyncio: Fix _format_coroutine for coroutine-like objects w/o __name__
Some built-in coroutine-like objects might not have __name__ or __qualname__. A good example of such are 'asend', 'aclose' and 'athrow' coroutine methods of asynchronous generators.
This commit is contained in:
parent
70b72f0f96
commit
6cc495e9e2
2 changed files with 12 additions and 4 deletions
|
@ -262,8 +262,12 @@ def _format_coroutine(coro):
|
||||||
assert iscoroutine(coro)
|
assert iscoroutine(coro)
|
||||||
|
|
||||||
if not hasattr(coro, 'cr_code') and not hasattr(coro, 'gi_code'):
|
if not hasattr(coro, 'cr_code') and not hasattr(coro, 'gi_code'):
|
||||||
# Most likely a Cython coroutine.
|
# Most likely a built-in type or a Cython coroutine.
|
||||||
coro_name = getattr(coro, '__qualname__', coro.__name__)
|
|
||||||
|
# Built-in types might not have __qualname__ or __name__.
|
||||||
|
coro_name = getattr(
|
||||||
|
coro, '__qualname__',
|
||||||
|
getattr(coro, '__name__', type(coro).__name__))
|
||||||
coro_name = '{}()'.format(coro_name)
|
coro_name = '{}()'.format(coro_name)
|
||||||
|
|
||||||
running = False
|
running = False
|
||||||
|
|
|
@ -2384,8 +2384,6 @@ class HandleTests(test_utils.TestCase):
|
||||||
# (such as ones compiled with Cython).
|
# (such as ones compiled with Cython).
|
||||||
|
|
||||||
class Coro:
|
class Coro:
|
||||||
__name__ = 'AAA'
|
|
||||||
|
|
||||||
def send(self, v):
|
def send(self, v):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -2399,6 +2397,7 @@ class HandleTests(test_utils.TestCase):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
coro = Coro()
|
coro = Coro()
|
||||||
|
coro.__name__ = 'AAA'
|
||||||
self.assertTrue(asyncio.iscoroutine(coro))
|
self.assertTrue(asyncio.iscoroutine(coro))
|
||||||
self.assertEqual(coroutines._format_coroutine(coro), 'AAA()')
|
self.assertEqual(coroutines._format_coroutine(coro), 'AAA()')
|
||||||
|
|
||||||
|
@ -2408,6 +2407,11 @@ class HandleTests(test_utils.TestCase):
|
||||||
coro.cr_running = True
|
coro.cr_running = True
|
||||||
self.assertEqual(coroutines._format_coroutine(coro), 'BBB() running')
|
self.assertEqual(coroutines._format_coroutine(coro), 'BBB() running')
|
||||||
|
|
||||||
|
coro = Coro()
|
||||||
|
# Some coroutines might not have '__name__', such as
|
||||||
|
# built-in async_gen.asend().
|
||||||
|
self.assertEqual(coroutines._format_coroutine(coro), 'Coro()')
|
||||||
|
|
||||||
|
|
||||||
class TimerTests(unittest.TestCase):
|
class TimerTests(unittest.TestCase):
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue