]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-34790: Implement deprecation of passing coroutines to asyncio.wait() (GH-16977)
authorKyle Stanley <aeros167@gmail.com>
Mon, 30 Dec 2019 11:50:19 +0000 (06:50 -0500)
committerAndrew Svetlov <andrew.svetlov@gmail.com>
Mon, 30 Dec 2019 11:50:19 +0000 (13:50 +0200)
Doc/whatsnew/3.9.rst
Lib/asyncio/tasks.py
Lib/test/test_asyncio/test_tasks.py

index b315604af5110c1f8e6a1a177bc61b7a8de0eac3..ff0fc24f317d4348201cebc8e558c51f761b182a 100644 (file)
@@ -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
 =======
index 894d28eb107acd7b439478152c4a78c2264f8f12..717837d856843679c5b5601dccdcb693a250fb0b 100644 (file)
@@ -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)
index dde84b84b103e9ef5312917433100123f58582d1..68f3b8cce9f65d7488740714d8effe6783383bff 100644 (file)
@@ -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