Commit 137c4f95 authored by Victor Stinner's avatar Victor Stinner

asyncio, Tulip issue 131: as_completed() and wait() now raises a TypeError if

the list of futures is not a list but a Future, Task or coroutine object
parent d91a0993
...@@ -358,6 +358,8 @@ def wait(fs, *, loop=None, timeout=None, return_when=ALL_COMPLETED): ...@@ -358,6 +358,8 @@ def wait(fs, *, loop=None, timeout=None, return_when=ALL_COMPLETED):
Note: This does not raise TimeoutError! Futures that aren't done Note: This does not raise TimeoutError! Futures that aren't done
when the timeout occurs are returned in the second set. when the timeout occurs are returned in the second set.
""" """
if isinstance(fs, futures.Future) or iscoroutine(fs):
raise TypeError("expect a list of futures, not %s" % type(fs).__name__)
if not fs: if not fs:
raise ValueError('Set of coroutines/Futures is empty.') raise ValueError('Set of coroutines/Futures is empty.')
...@@ -474,6 +476,8 @@ def as_completed(fs, *, loop=None, timeout=None): ...@@ -474,6 +476,8 @@ def as_completed(fs, *, loop=None, timeout=None):
Note: The futures 'f' are not necessarily members of fs. Note: The futures 'f' are not necessarily members of fs.
""" """
if isinstance(fs, futures.Future) or iscoroutine(fs):
raise TypeError("expect a list of futures, not %s" % type(fs).__name__)
loop = loop if loop is not None else events.get_event_loop() loop = loop if loop is not None else events.get_event_loop()
deadline = None if timeout is None else loop.time() + timeout deadline = None if timeout is None else loop.time() + timeout
todo = {async(f, loop=loop) for f in set(fs)} todo = {async(f, loop=loop) for f in set(fs)}
......
...@@ -7,6 +7,11 @@ import asyncio ...@@ -7,6 +7,11 @@ import asyncio
from asyncio import test_utils from asyncio import test_utils
@asyncio.coroutine
def coroutine_function():
pass
class Dummy: class Dummy:
def __repr__(self): def __repr__(self):
...@@ -1338,6 +1343,27 @@ class TaskTests(unittest.TestCase): ...@@ -1338,6 +1343,27 @@ class TaskTests(unittest.TestCase):
child2.set_result(2) child2.set_result(2)
test_utils.run_briefly(self.loop) test_utils.run_briefly(self.loop)
def test_as_completed_invalid_args(self):
fut = asyncio.Future(loop=self.loop)
# as_completed() expects a list of futures, not a future instance
self.assertRaises(TypeError, self.loop.run_until_complete,
asyncio.as_completed(fut, loop=self.loop))
self.assertRaises(TypeError, self.loop.run_until_complete,
asyncio.as_completed(coroutine_function(), loop=self.loop))
def test_wait_invalid_args(self):
fut = asyncio.Future(loop=self.loop)
# wait() expects a list of futures, not a future instance
self.assertRaises(TypeError, self.loop.run_until_complete,
asyncio.wait(fut, loop=self.loop))
self.assertRaises(TypeError, self.loop.run_until_complete,
asyncio.wait(coroutine_function(), loop=self.loop))
# wait() expects at least a future
self.assertRaises(ValueError, self.loop.run_until_complete,
asyncio.wait([], loop=self.loop))
class GatherTestsBase: class GatherTestsBase:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment