asyncio: Coroutine objects are now rejected with a TypeError by the following
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).
This commit is contained in:
parent
c1ad35aae8
commit
2d99d93d11
@ -357,7 +357,8 @@ class BaseEventLoop(events.AbstractEventLoop):
|
|||||||
|
|
||||||
Absolute time corresponds to the event loop's time() method.
|
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()")
|
raise TypeError("coroutines cannot be used with call_at()")
|
||||||
if self._debug:
|
if self._debug:
|
||||||
self._assert_is_current_event_loop()
|
self._assert_is_current_event_loop()
|
||||||
@ -384,7 +385,8 @@ class BaseEventLoop(events.AbstractEventLoop):
|
|||||||
return handle
|
return handle
|
||||||
|
|
||||||
def _call_soon(self, callback, args, check_loop):
|
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()")
|
raise TypeError("coroutines cannot be used with call_soon()")
|
||||||
if self._debug and check_loop:
|
if self._debug and check_loop:
|
||||||
self._assert_is_current_event_loop()
|
self._assert_is_current_event_loop()
|
||||||
@ -421,8 +423,9 @@ class BaseEventLoop(events.AbstractEventLoop):
|
|||||||
return handle
|
return handle
|
||||||
|
|
||||||
def run_in_executor(self, executor, callback, *args):
|
def run_in_executor(self, executor, callback, *args):
|
||||||
if coroutines.iscoroutinefunction(callback):
|
if (coroutines.iscoroutine(callback)
|
||||||
raise TypeError("Coroutines cannot be used with run_in_executor()")
|
or coroutines.iscoroutinefunction(callback)):
|
||||||
|
raise TypeError("coroutines cannot be used with run_in_executor()")
|
||||||
if isinstance(callback, events.Handle):
|
if isinstance(callback, events.Handle):
|
||||||
assert not args
|
assert not args
|
||||||
assert not isinstance(callback, events.TimerHandle)
|
assert not isinstance(callback, events.TimerHandle)
|
||||||
|
@ -67,8 +67,9 @@ class _UnixSelectorEventLoop(selector_events.BaseSelectorEventLoop):
|
|||||||
Raise ValueError if the signal number is invalid or uncatchable.
|
Raise ValueError if the signal number is invalid or uncatchable.
|
||||||
Raise RuntimeError if there is a problem setting up the handler.
|
Raise RuntimeError if there is a problem setting up the handler.
|
||||||
"""
|
"""
|
||||||
if coroutines.iscoroutinefunction(callback):
|
if (coroutines.iscoroutine(callback)
|
||||||
raise TypeError("coroutines cannot be used with call_soon()")
|
or coroutines.iscoroutinefunction(callback)):
|
||||||
|
raise TypeError("coroutines cannot be used with add_signal_handler()")
|
||||||
self._check_signal(sig)
|
self._check_signal(sig)
|
||||||
try:
|
try:
|
||||||
# set_wakeup_fd() raises ValueError if this is not the
|
# set_wakeup_fd() raises ValueError if this is not the
|
||||||
|
@ -1107,19 +1107,23 @@ class BaseEventLoopWithSelectorTests(test_utils.TestCase):
|
|||||||
|
|
||||||
def test_call_coroutine(self):
|
def test_call_coroutine(self):
|
||||||
@asyncio.coroutine
|
@asyncio.coroutine
|
||||||
def coroutine_function():
|
def simple_coroutine():
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
coro_func = simple_coroutine
|
||||||
|
coro_obj = coro_func()
|
||||||
|
self.addCleanup(coro_obj.close)
|
||||||
|
for func in (coro_func, coro_obj):
|
||||||
with self.assertRaises(TypeError):
|
with self.assertRaises(TypeError):
|
||||||
self.loop.call_soon(coroutine_function)
|
self.loop.call_soon(func)
|
||||||
with self.assertRaises(TypeError):
|
with self.assertRaises(TypeError):
|
||||||
self.loop.call_soon_threadsafe(coroutine_function)
|
self.loop.call_soon_threadsafe(func)
|
||||||
with self.assertRaises(TypeError):
|
with self.assertRaises(TypeError):
|
||||||
self.loop.call_later(60, coroutine_function)
|
self.loop.call_later(60, func)
|
||||||
with self.assertRaises(TypeError):
|
with self.assertRaises(TypeError):
|
||||||
self.loop.call_at(self.loop.time() + 60, coroutine_function)
|
self.loop.call_at(self.loop.time() + 60, func)
|
||||||
with self.assertRaises(TypeError):
|
with self.assertRaises(TypeError):
|
||||||
self.loop.run_in_executor(None, coroutine_function)
|
self.loop.run_in_executor(None, func)
|
||||||
|
|
||||||
@mock.patch('asyncio.base_events.logger')
|
@mock.patch('asyncio.base_events.logger')
|
||||||
def test_log_slow_callbacks(self, m_logger):
|
def test_log_slow_callbacks(self, m_logger):
|
||||||
|
@ -65,15 +65,21 @@ class SelectorEventLoopSignalTests(test_utils.TestCase):
|
|||||||
|
|
||||||
@mock.patch('asyncio.unix_events.signal')
|
@mock.patch('asyncio.unix_events.signal')
|
||||||
def test_add_signal_handler_coroutine_error(self, m_signal):
|
def test_add_signal_handler_coroutine_error(self, m_signal):
|
||||||
|
m_signal.NSIG = signal.NSIG
|
||||||
|
|
||||||
@asyncio.coroutine
|
@asyncio.coroutine
|
||||||
def simple_coroutine():
|
def simple_coroutine():
|
||||||
yield from []
|
yield from []
|
||||||
|
|
||||||
self.assertRaises(
|
# callback must not be a coroutine function
|
||||||
TypeError,
|
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,
|
self.loop.add_signal_handler,
|
||||||
signal.SIGINT, simple_coroutine)
|
signal.SIGINT, func)
|
||||||
|
|
||||||
@mock.patch('asyncio.unix_events.signal')
|
@mock.patch('asyncio.unix_events.signal')
|
||||||
def test_add_signal_handler(self, m_signal):
|
def test_add_signal_handler(self, m_signal):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user