diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2014-07-10 23:04:16 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2014-07-10 23:04:16 (GMT) |
commit | 737c34fa85f35479acc37868958c66208349e3d7 (patch) | |
tree | 69da2d99fb4dcf1fd7bbd6c6b2b2aa137c3dfbfc | |
parent | c39ba7d611fe556314acc8c11cd9f805512db663 (diff) | |
download | cpython-737c34fa85f35479acc37868958c66208349e3d7.zip cpython-737c34fa85f35479acc37868958c66208349e3d7.tar.gz cpython-737c34fa85f35479acc37868958c66208349e3d7.tar.bz2 |
asyncio: sync with Tulip
- CoroWrapper.__del__() now reuses repr(CoroWrapper) to log the "... was never
yielded from" warning
- Improve CoroWrapper: copy also the qualified name on Python 3.4, not only on
Python 3.5+
-rw-r--r-- | Lib/asyncio/coroutines.py | 12 | ||||
-rw-r--r-- | Lib/asyncio/tasks.py | 1 | ||||
-rw-r--r-- | Lib/test/test_asyncio/test_tasks.py | 11 |
3 files changed, 6 insertions, 18 deletions
diff --git a/Lib/asyncio/coroutines.py b/Lib/asyncio/coroutines.py index 4cbfa85..c28de95 100644 --- a/Lib/asyncio/coroutines.py +++ b/Lib/asyncio/coroutines.py @@ -29,8 +29,6 @@ _YIELD_FROM = opcode.opmap['YIELD_FROM'] _DEBUG = (not sys.flags.ignore_environment and bool(os.environ.get('PYTHONASYNCIODEBUG'))) -_PY35 = (sys.version_info >= (3, 5)) - # Check for CPython issue #21209 def has_yield_from_bug(): @@ -119,8 +117,7 @@ class CoroWrapper: gen = getattr(self, 'gen', None) frame = getattr(gen, 'gi_frame', None) if frame is not None and frame.f_lasti == -1: - func = events._format_callback(self.func, ()) - msg = 'Coroutine %s was never yielded from' % func + msg = '%r was never yielded from' % self tb = getattr(self, '_source_traceback', ()) if tb: tb = ''.join(traceback.format_list(tb)) @@ -155,7 +152,7 @@ def coroutine(func): if w._source_traceback: del w._source_traceback[-1] w.__name__ = func.__name__ - if _PY35: + if hasattr(func, '__qualname__'): w.__qualname__ = func.__qualname__ w.__doc__ = func.__doc__ return w @@ -178,10 +175,7 @@ def iscoroutine(obj): def _format_coroutine(coro): assert iscoroutine(coro) - if _PY35: - coro_name = coro.__qualname__ - else: - coro_name = coro.__name__ + coro_name = getattr(coro, '__qualname__', coro.__name__) filename = coro.gi_code.co_filename if (isinstance(coro, CoroWrapper) diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index 61f4822..3d7e5a4 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -21,7 +21,6 @@ from .coroutines import coroutine from .log import logger _PY34 = (sys.version_info >= (3, 4)) -_PY35 = (sys.version_info >= (3, 5)) class Task(futures.Future): diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py index b13818f..85648dc 100644 --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -150,7 +150,7 @@ class TaskTests(test_utils.TestCase): # test coroutine object gen = notmuch() - if PY35: + if coroutines._DEBUG or PY35: coro_qualname = 'TaskTests.test_task_repr.<locals>.notmuch' else: coro_qualname = 'notmuch' @@ -205,17 +205,12 @@ class TaskTests(test_utils.TestCase): # test coroutine object gen = notmuch() - if PY35: + if coroutines._DEBUG or PY35: # On Python >= 3.5, generators now inherit the name of the # function, as expected, and have a qualified name (__qualname__ # attribute). coro_name = 'notmuch' coro_qualname = 'TaskTests.test_task_repr_coro_decorator.<locals>.notmuch' - elif coroutines._DEBUG: - # In debug mode, @coroutine decorator uses CoroWrapper which gets - # its name (__name__ attribute) from the wrapped coroutine - # function. - coro_name = coro_qualname = 'notmuch' else: # On Python < 3.5, generators inherit the name of the code, not of # the function. See: http://bugs.python.org/issue21205 @@ -1653,7 +1648,7 @@ class TaskTests(test_utils.TestCase): self.assertTrue(m_log.error.called) message = m_log.error.call_args[0][0] func_filename, func_lineno = test_utils.get_function_source(coro_noop) - regex = (r'^Coroutine %s\(\) at %s:%s was never yielded from\n' + regex = (r'^<CoroWrapper %s\(\) .* at %s:%s, .*> was never yielded from\n' r'Coroutine object created at \(most recent call last\):\n' r'.*\n' r' File "%s", line %s, in test_coroutine_never_yielded\n' |