Skip to content

Commit 5770d71

Browse files
committed
Return Task.__await__ to avoid TypeError when loop debug is False
python/asyncio#451
1 parent b861820 commit 5770d71

File tree

2 files changed

+17
-7
lines changed

2 files changed

+17
-7
lines changed

pydispatch/aioutils.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,8 @@ async def wait(self):
138138
await self.aio_event.wait()
139139
return self.args, self.kwargs
140140
def __await__(self):
141-
return self.wait()
141+
task = asyncio.ensure_future(self.wait())
142+
return task.__await__()
142143

143144
class AioEventWaiters(object):
144145
"""Container used to manage :keyword:`await` use with events
@@ -188,7 +189,8 @@ async def wait(self):
188189
waiter = await self.add_waiter()
189190
return await waiter
190191
def __await__(self):
191-
return self.wait()
192+
task = asyncio.ensure_future(self.wait())
193+
return task.__await__()
192194
def __call__(self, *args, **kwargs):
193195
"""Triggers any stored :class:`waiters <AioEventWaiter>`
194196

tests/test_aio_listeners.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ def __init__(self, mainloop, sender):
7777
self.stopped = threading.Event()
7878
def run(self):
7979
loop = self.loop = asyncio.new_event_loop()
80+
loop.set_debug(self.mainloop.get_debug())
8081
asyncio.set_event_loop(loop)
8182
listener = AsyncListener(loop, self.mainloop)
8283
sender = self.sender
@@ -95,15 +96,20 @@ def stop(self):
9596
self.running.clear()
9697
self.stopped.wait()
9798

99+
@pytest.fixture(params=[True, False])
100+
def loop_debug(request):
101+
return request.param
102+
98103
@pytest.mark.asyncio
99-
async def test_simple(sender_cls):
104+
async def test_simple(sender_cls, loop_debug):
100105

101106
class Sender(sender_cls):
102107
prop_a = Property()
103108
prop_b = Property()
104109
_events_ = ['on_test_a', 'on_test_b', 'on_test_c']
105110

106111
loop = asyncio.get_event_loop()
112+
loop.set_debug(loop_debug)
107113

108114
sender = Sender()
109115
listener = AsyncListener(loop, loop)
@@ -131,14 +137,15 @@ class Sender(sender_cls):
131137
assert data['loop'] is loop
132138

133139
@pytest.mark.asyncio
134-
async def test_unbind(sender_cls):
140+
async def test_unbind(sender_cls, loop_debug):
135141

136142
class Sender(sender_cls):
137143
prop_a = Property()
138144
prop_b = Property()
139145
_events_ = ['on_test_a', 'on_test_b', 'on_test_c']
140146

141147
loop = asyncio.get_event_loop()
148+
loop.set_debug(loop_debug)
142149

143150
sender = Sender()
144151
listener = AsyncListener(loop, loop)
@@ -217,7 +224,7 @@ async def check_events_unbound():
217224
await check_events_unbound()
218225

219226
@pytest.mark.asyncio
220-
async def test_multiple_loops(sender_cls):
227+
async def test_multiple_loops(sender_cls, loop_debug):
221228

222229
class Sender(sender_cls):
223230
prop_a = Property()
@@ -226,6 +233,7 @@ class Sender(sender_cls):
226233

227234
sender = Sender()
228235
mainloop = asyncio.get_event_loop()
236+
mainloop.set_debug(loop_debug)
229237

230238
async def send_event(name, *listener_threads):
231239
sender.trigger_event(name)
@@ -271,15 +279,15 @@ async def trigger_prop(name, value, *listener_threads):
271279
t.stop()
272280

273281
@pytest.mark.asyncio
274-
async def test_event_await(sender_cls):
282+
async def test_event_await(sender_cls, loop_debug):
275283

276284
class Sender(sender_cls):
277285
prop_a = Property()
278286
prop_b = Property()
279287
_events_ = ['on_test_a', 'on_test_b', 'on_test_c']
280288

281289
loop = asyncio.get_event_loop()
282-
loop.set_debug(True)
290+
loop.set_debug(loop_debug)
283291

284292
sender = Sender()
285293

0 commit comments

Comments
 (0)