]> granicus.if.org Git - python/commitdiff
asyncio: sync with Tulip
authorVictor Stinner <victor.stinner@gmail.com>
Thu, 10 Jul 2014 23:04:16 +0000 (01:04 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Thu, 10 Jul 2014 23:04:16 +0000 (01:04 +0200)
- 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+

Lib/asyncio/coroutines.py
Lib/asyncio/tasks.py
Lib/test/test_asyncio/test_tasks.py

index 4cbfa854ef70cb643f2f74fa88599509cc44ed77..c28de95a46b25293b3cb7f6a5035de248665e9b1 100644 (file)
@@ -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)
index 61f48223ca3489214c6813f76f8272131d8019fd..3d7e5a433344ae3602c1ba7e99506bac4a9cf911 100644 (file)
@@ -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):
index b13818f7f3299cd21e45e97a8d5a40c53ae90fc6..85648dc4cee02e7bbd4ee8e15664fc9f8a9b2975 100644 (file)
@@ -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'