[Python-checkins] cpython (merge 3.5 -> 3.6): Merge 3.5 (issue #28703)

yury.selivanov python-checkins at python.org
Tue Nov 15 15:21:40 EST 2016


https://hg.python.org/cpython/rev/4d78290b1d8e
changeset: 105132:4d78290b1d8e
branch: 3.6
parent: 105129:38ec88a4e282
parent: 105131:179e556a50ce
user: Yury Selivanov <yury at magic.io>
date: Tue Nov 15 15:21:07 2016 -0500
summary:
 Merge 3.5 (issue #28703)
files:
 Lib/asyncio/coroutines.py | 16 ++++++++++++++--
 Lib/test/test_asyncio/test_tasks.py | 2 ++
 Misc/NEWS | 2 ++
 3 files changed, 18 insertions(+), 2 deletions(-)
diff --git a/Lib/asyncio/coroutines.py b/Lib/asyncio/coroutines.py
--- a/Lib/asyncio/coroutines.py
+++ b/Lib/asyncio/coroutines.py
@@ -33,12 +33,16 @@
 
 try:
 _types_coroutine = types.coroutine
+ _types_CoroutineType = types.CoroutineType
 except AttributeError:
+ # Python 3.4
 _types_coroutine = None
+ _types_CoroutineType = None
 
 try:
 _inspect_iscoroutinefunction = inspect.iscoroutinefunction
 except AttributeError:
+ # Python 3.4
 _inspect_iscoroutinefunction = lambda func: False
 
 try:
@@ -238,19 +242,27 @@
 w.__qualname__ = getattr(func, '__qualname__', None)
 return w
 
- wrapper._is_coroutine = True # For iscoroutinefunction().
+ wrapper._is_coroutine = _is_coroutine # For iscoroutinefunction().
 return wrapper
 
 
+# A marker for iscoroutinefunction.
+_is_coroutine = object()
+
+
 def iscoroutinefunction(func):
 """Return True if func is a decorated coroutine function."""
- return (getattr(func, '_is_coroutine', False) or
+ return (getattr(func, '_is_coroutine', None) is _is_coroutine or
 _inspect_iscoroutinefunction(func))
 
 
 _COROUTINE_TYPES = (types.GeneratorType, CoroWrapper)
 if _CoroutineABC is not None:
 _COROUTINE_TYPES += (_CoroutineABC,)
+if _types_CoroutineType is not None:
+ # Prioritize native coroutine check to speed-up
+ # asyncio.iscoroutine.
+ _COROUTINE_TYPES = (_types_CoroutineType,) + _COROUTINE_TYPES
 
 
 def iscoroutine(obj):
diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py
--- a/Lib/test/test_asyncio/test_tasks.py
+++ b/Lib/test/test_asyncio/test_tasks.py
@@ -1390,6 +1390,8 @@
 yield
 self.assertTrue(asyncio.iscoroutinefunction(fn2))
 
+ self.assertFalse(asyncio.iscoroutinefunction(mock.Mock()))
+
 def test_yield_vs_yield_from(self):
 fut = self.new_future(self.loop)
 
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -58,6 +58,8 @@
 
 - Issue #28653: Fix a refleak in functools.lru_cache.
 
+- Issue #28703: Fix asyncio.iscoroutinefunction to handle Mock objects.
+
 Documentation
 -------------
 
-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /