]> granicus.if.org Git - python/commitdiff
asyncio: Coroutine objects are now rejected with a TypeError by the following
authorVictor Stinner <victor.stinner@gmail.com>
Thu, 20 Nov 2014 14:03:52 +0000 (15:03 +0100)
committerVictor Stinner <victor.stinner@gmail.com>
Thu, 20 Nov 2014 14:03:52 +0000 (15:03 +0100)
functions:

* add_signal_handler()
* call_at()
* call_later()
* call_soon()
* call_soon_threadsafe()
* run_in_executor()

Fix also the error message of add_signal_handler() (fix the name of the
function).

Lib/asyncio/base_events.py
Lib/asyncio/unix_events.py
Lib/test/test_asyncio/test_base_events.py
Lib/test/test_asyncio/test_unix_events.py

index b6b712393bce56031686dcafe01665006f363b72..40dd66827b66cb067f8b5d7ed87d0d801e94eb10 100644 (file)
@@ -357,7 +357,8 @@ class BaseEventLoop(events.AbstractEventLoop):
 
         Absolute time corresponds to the event loop's time() method.
         """
-        if coroutines.iscoroutinefunction(callback):
+        if (coroutines.iscoroutine(callback)
+        or coroutines.iscoroutinefunction(callback)):
             raise TypeError("coroutines cannot be used with call_at()")
         if self._debug:
             self._assert_is_current_event_loop()
@@ -384,7 +385,8 @@ class BaseEventLoop(events.AbstractEventLoop):
         return handle
 
     def _call_soon(self, callback, args, check_loop):
-        if coroutines.iscoroutinefunction(callback):
+        if (coroutines.iscoroutine(callback)
+        or coroutines.iscoroutinefunction(callback)):
             raise TypeError("coroutines cannot be used with call_soon()")
         if self._debug and check_loop:
             self._assert_is_current_event_loop()
@@ -421,8 +423,9 @@ class BaseEventLoop(events.AbstractEventLoop):
         return handle
 
     def run_in_executor(self, executor, callback, *args):
-        if coroutines.iscoroutinefunction(callback):
-            raise TypeError("Coroutines cannot be used with run_in_executor()")
+        if (coroutines.iscoroutine(callback)
+        or coroutines.iscoroutinefunction(callback)):
+            raise TypeError("coroutines cannot be used with run_in_executor()")
         if isinstance(callback, events.Handle):
             assert not args
             assert not isinstance(callback, events.TimerHandle)
index e49212e5ea08bf51c28186b505b238d4ffd99757..efe06d4a1999ee00746efec2de609a8f86b3a16e 100644 (file)
@@ -67,8 +67,9 @@ class _UnixSelectorEventLoop(selector_events.BaseSelectorEventLoop):
         Raise ValueError if the signal number is invalid or uncatchable.
         Raise RuntimeError if there is a problem setting up the handler.
         """
-        if coroutines.iscoroutinefunction(callback):
-            raise TypeError("coroutines cannot be used with call_soon()")
+        if (coroutines.iscoroutine(callback)
+        or coroutines.iscoroutinefunction(callback)):
+            raise TypeError("coroutines cannot be used with add_signal_handler()")
         self._check_signal(sig)
         try:
             # set_wakeup_fd() raises ValueError if this is not the
index d61a64c9a383234397f7f75fdd75366642bcc633..0aa01174eaa18d5aa018b2cb022623bec3d61924 100644 (file)
@@ -1107,19 +1107,23 @@ class BaseEventLoopWithSelectorTests(test_utils.TestCase):
 
     def test_call_coroutine(self):
         @asyncio.coroutine
-        def coroutine_function():
+        def simple_coroutine():
             pass
 
-        with self.assertRaises(TypeError):
-            self.loop.call_soon(coroutine_function)
-        with self.assertRaises(TypeError):
-            self.loop.call_soon_threadsafe(coroutine_function)
-        with self.assertRaises(TypeError):
-            self.loop.call_later(60, coroutine_function)
-        with self.assertRaises(TypeError):
-            self.loop.call_at(self.loop.time() + 60, coroutine_function)
-        with self.assertRaises(TypeError):
-            self.loop.run_in_executor(None, coroutine_function)
+        coro_func = simple_coroutine
+        coro_obj = coro_func()
+        self.addCleanup(coro_obj.close)
+        for func in (coro_func, coro_obj):
+            with self.assertRaises(TypeError):
+                self.loop.call_soon(func)
+            with self.assertRaises(TypeError):
+                self.loop.call_soon_threadsafe(func)
+            with self.assertRaises(TypeError):
+                self.loop.call_later(60, func)
+            with self.assertRaises(TypeError):
+                self.loop.call_at(self.loop.time() + 60, func)
+            with self.assertRaises(TypeError):
+                self.loop.run_in_executor(None, func)
 
     @mock.patch('asyncio.base_events.logger')
     def test_log_slow_callbacks(self, m_logger):
index 2f3fa185c958ac3fc1636468d46d13c1dba1f83e..b6ad0189215b2e162c4450284bbc866821ee7b1f 100644 (file)
@@ -65,15 +65,21 @@ class SelectorEventLoopSignalTests(test_utils.TestCase):
 
     @mock.patch('asyncio.unix_events.signal')
     def test_add_signal_handler_coroutine_error(self, m_signal):
+        m_signal.NSIG = signal.NSIG
 
         @asyncio.coroutine
         def simple_coroutine():
             yield from []
 
-        self.assertRaises(
-            TypeError,
-            self.loop.add_signal_handler,
-            signal.SIGINT, simple_coroutine)
+        # callback must not be a coroutine function
+        coro_func = simple_coroutine
+        coro_obj = coro_func()
+        self.addCleanup(coro_obj.close)
+        for func in (coro_func, coro_obj):
+            self.assertRaisesRegex(
+                TypeError, 'coroutines cannot be used with add_signal_handler',
+                self.loop.add_signal_handler,
+                signal.SIGINT, func)
 
     @mock.patch('asyncio.unix_events.signal')
     def test_add_signal_handler(self, m_signal):