summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKyle Stanley <aeros167@gmail.com>2019-12-30 11:50:19 (GMT)
committerAndrew Svetlov <andrew.svetlov@gmail.com>2019-12-30 11:50:19 (GMT)
commit89aa7f0ede1a11c020e83f24394593c577a61509 (patch)
treee570c3365f871fa9e7c82909e48d81c85f3ad718
parent88dce26da6bc4838092128d9a6f1c98bf48b7c90 (diff)
downloadcpython-89aa7f0ede1a11c020e83f24394593c577a61509.zip
cpython-89aa7f0ede1a11c020e83f24394593c577a61509.tar.gz
cpython-89aa7f0ede1a11c020e83f24394593c577a61509.tar.bz2
bpo-34790: Implement deprecation of passing coroutines to asyncio.wait() (GH-16977)
-rw-r--r--Doc/whatsnew/3.9.rst3
-rw-r--r--Lib/asyncio/tasks.py6
-rw-r--r--Lib/test/test_asyncio/test_tasks.py24
3 files changed, 28 insertions, 5 deletions
diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst
index b315604..ff0fc24 100644
--- a/Doc/whatsnew/3.9.rst
+++ b/Doc/whatsnew/3.9.rst
@@ -290,6 +290,9 @@ Deprecated
predicable behavior.
(Contributed by Serhiy Storchaka in :issue:`38371`.)
+* The explicit passing of coroutine objects to :func:`asyncio.wait` has been
+ deprecated and will be removed in version 3.11.
+ (Contributed by Yury Selivanov and Kyle Stanley in :issue:`34790`.)
Removed
=======
diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py
index 894d28e..717837d 100644
--- a/Lib/asyncio/tasks.py
+++ b/Lib/asyncio/tasks.py
@@ -424,6 +424,12 @@ async def wait(fs, *, loop=None, timeout=None, return_when=ALL_COMPLETED):
"and scheduled for removal in Python 3.10.",
DeprecationWarning, stacklevel=2)
+ if any(coroutines.iscoroutine(f) for f in set(fs)):
+ warnings.warn("The explicit passing of coroutine objects to "
+ "asyncio.wait() is deprecated since Python 3.8, and "
+ "scheduled for removal in Python 3.11.",
+ DeprecationWarning, stacklevel=2)
+
fs = {ensure_future(f, loop=loop) for f in set(fs)}
return await _wait(fs, timeout, return_when, loop)
diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py
index dde84b8..68f3b8c 100644
--- a/Lib/test/test_asyncio/test_tasks.py
+++ b/Lib/test/test_asyncio/test_tasks.py
@@ -979,12 +979,12 @@ class BaseTaskTests:
def coro(s):
return s
c = coro('test')
-
- task =self.new_task(
+ task = self.new_task(
self.loop,
asyncio.wait([c, c, coro('spam')]))
- done, pending = self.loop.run_until_complete(task)
+ with self.assertWarns(DeprecationWarning):
+ done, pending = self.loop.run_until_complete(task)
self.assertFalse(pending)
self.assertEqual(set(f.result() for f in done), {'test', 'spam'})
@@ -1346,7 +1346,9 @@ class BaseTaskTests:
futs = list(asyncio.as_completed(fs, loop=loop))
self.assertEqual(len(futs), 2)
waiter = asyncio.wait(futs)
- done, pending = loop.run_until_complete(waiter)
+ # Deprecation from passing coros in futs to asyncio.wait()
+ with self.assertWarns(DeprecationWarning):
+ done, pending = loop.run_until_complete(waiter)
self.assertEqual(set(f.result() for f in done), {'a', 'b'})
def test_as_completed_duplicate_coroutines(self):
@@ -1751,7 +1753,8 @@ class BaseTaskTests:
async def outer():
nonlocal proof
- d, p = await asyncio.wait([inner()])
+ with self.assertWarns(DeprecationWarning):
+ d, p = await asyncio.wait([inner()])
proof += 100
f = asyncio.ensure_future(outer(), loop=self.loop)
@@ -3307,6 +3310,17 @@ class WaitTests(test_utils.TestCase):
self.loop.run_until_complete(
asyncio.wait_for(coroutine_function(), 0.01, loop=self.loop))
+ def test_coro_is_deprecated_in_wait(self):
+ # Remove test when passing coros to asyncio.wait() is removed in 3.11
+ with self.assertWarns(DeprecationWarning):
+ self.loop.run_until_complete(
+ asyncio.wait([coroutine_function()]))
+
+ task = self.loop.create_task(coroutine_function())
+ with self.assertWarns(DeprecationWarning):
+ self.loop.run_until_complete(
+ asyncio.wait([task, coroutine_function()]))
+
class CompatibilityTests(test_utils.TestCase):
# Tests for checking a bridge between old-styled coroutines