Browse Source

Optimise attribute access when dispatching.

pull/468/head
Rapptz 8 years ago
parent
commit
234fd5180f
  1. 22
      discord/client.py
  2. 19
      discord/ext/commands/bot.py

22
discord/client.py

@ -248,14 +248,14 @@ class Client:
object.__setattr__(self, name, value)
@asyncio.coroutine
def _run_event(self, event, *args, **kwargs):
def _run_event(self, coro, event_name, *args, **kwargs):
try:
yield from getattr(self, event)(*args, **kwargs)
yield from coro(*args, **kwargs)
except asyncio.CancelledError:
pass
except Exception:
try:
yield from self.on_error(event, *args, **kwargs)
yield from self.on_error(event_name, *args, **kwargs)
except asyncio.CancelledError:
pass
@ -264,11 +264,19 @@ class Client:
method = 'on_' + event
handler = 'handle_' + event
if hasattr(self, handler):
getattr(self, handler)(*args, **kwargs)
try:
actual_handler = getattr(self, handler)
except AttributeError:
pass
else:
actual_handler(*args, **kwargs)
if hasattr(self, method):
compat.create_task(self._run_event(method, *args, **kwargs), loop=self.loop)
try:
coro = getattr(self, method)
except AttributeError:
pass
else:
compat.create_task(self._run_event(coro, method, *args, **kwargs), loop=self.loop)
@asyncio.coroutine
def on_error(self, event_method, *args, **kwargs):

19
discord/ext/commands/bot.py

@ -164,25 +164,12 @@ class BotBase(GroupMixin):
# internal helpers
@asyncio.coroutine
def _run_extra(self, coro, event_name, *args, **kwargs):
try:
yield from coro(*args, **kwargs)
except asyncio.CancelledError:
pass
except Exception:
try:
yield from self.on_error(event_name, *args, **kwargs)
except asyncio.CancelledError:
pass
def dispatch(self, event_name, *args, **kwargs):
super().dispatch(event_name, *args, **kwargs)
ev = 'on_' + event_name
if ev in self.extra_events:
for event in self.extra_events[ev]:
coro = self._run_extra(event, event_name, *args, **kwargs)
discord.compat.create_task(coro, loop=self.loop)
for event in self.extra_events.get(ev, []):
coro = self._run_event(event, event_name, *args, **kwargs)
discord.compat.create_task(coro, loop=self.loop)
@asyncio.coroutine
def close(self):

Loading…
Cancel
Save