mirror of
https://github.com/aiogram/aiogram.git
synced 2026-04-08 16:37:47 +00:00
Attempt to optimize
Now introspection takes place during handler registration. I am not sure about this implementation.
This commit is contained in:
parent
088116e1c7
commit
a977ae3318
1 changed files with 11 additions and 2 deletions
|
|
@ -13,11 +13,15 @@ class CancelHandler(Exception):
|
|||
pass
|
||||
|
||||
|
||||
def _check_spec(func: callable, kwargs: dict):
|
||||
def _get_spec(func: callable):
|
||||
while hasattr(func, '__wrapped__'): # Try to resolve decorated callbacks
|
||||
func = func.__wrapped__
|
||||
|
||||
spec = inspect.getfullargspec(func)
|
||||
return spec, func
|
||||
|
||||
|
||||
def _check_spec(spec, kwargs: dict):
|
||||
if spec.varkw:
|
||||
return kwargs
|
||||
|
||||
|
|
@ -30,6 +34,7 @@ class Handler:
|
|||
self.once = once
|
||||
|
||||
self.handlers = []
|
||||
self.specs = {}
|
||||
self.middleware_key = middleware_key
|
||||
|
||||
def register(self, handler, filters=None, index=None):
|
||||
|
|
@ -42,6 +47,9 @@ class Handler:
|
|||
:param filters: list of filters
|
||||
:param index: you can reorder handlers
|
||||
"""
|
||||
spec, handler = _get_spec(handler)
|
||||
self.specs[handler] = spec
|
||||
|
||||
if filters and not isinstance(filters, (list, tuple, set)):
|
||||
filters = [filters]
|
||||
record = (filters, handler)
|
||||
|
|
@ -60,6 +68,7 @@ class Handler:
|
|||
for handler_with_filters in self.handlers:
|
||||
_, registered = handler_with_filters
|
||||
if handler is registered:
|
||||
self.specs.pop(handler, None)
|
||||
self.handlers.remove(handler_with_filters)
|
||||
return True
|
||||
raise ValueError('This handler is not registered!')
|
||||
|
|
@ -95,7 +104,7 @@ class Handler:
|
|||
try:
|
||||
if self.middleware_key:
|
||||
await self.dispatcher.middleware.trigger(f"process_{self.middleware_key}", args + (data,))
|
||||
partial_data = _check_spec(handler, data)
|
||||
partial_data = _check_spec(self.specs[handler], data)
|
||||
response = await handler(*args, **partial_data)
|
||||
if response is not None:
|
||||
results.append(response)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue