mirror of
https://github.com/aiogram/aiogram.git
synced 2026-04-08 16:37:47 +00:00
new improved CallableMixin (#1357)
* optimized CallableMixin * changes and Sets * reformatted * Update CHANGES/1357.misc.rst Co-authored-by: Oleg A. <t0rr@mail.ru> --------- Co-authored-by: Oleg A. <t0rr@mail.ru>
This commit is contained in:
parent
9b5e462068
commit
e76f4c38ad
3 changed files with 17 additions and 13 deletions
|
|
@ -4,7 +4,7 @@ import inspect
|
|||
import warnings
|
||||
from dataclasses import dataclass, field
|
||||
from functools import partial
|
||||
from typing import Any, Callable, Dict, List, Optional, Tuple
|
||||
from typing import Any, Callable, Dict, List, Optional, Tuple, Set
|
||||
|
||||
from magic_filter.magic import MagicFilter as OriginalMagicFilter
|
||||
|
||||
|
|
@ -21,20 +21,21 @@ CallbackType = Callable[..., Any]
|
|||
class CallableMixin:
|
||||
callback: CallbackType
|
||||
awaitable: bool = field(init=False)
|
||||
spec: inspect.FullArgSpec = field(init=False)
|
||||
params: Set[str] = field(init=False)
|
||||
varkw: bool = field(init=False)
|
||||
|
||||
def __post_init__(self) -> None:
|
||||
callback = inspect.unwrap(self.callback)
|
||||
self.awaitable = inspect.isawaitable(callback) or inspect.iscoroutinefunction(callback)
|
||||
self.spec = inspect.getfullargspec(callback)
|
||||
spec = inspect.getfullargspec(callback)
|
||||
self.params = {*spec.args, *spec.kwonlyargs}
|
||||
self.varkw = spec.varkw is not None
|
||||
|
||||
def _prepare_kwargs(self, kwargs: Dict[str, Any]) -> Dict[str, Any]:
|
||||
if self.spec.varkw:
|
||||
if self.varkw:
|
||||
return kwargs
|
||||
|
||||
return {
|
||||
k: v for k, v in kwargs.items() if k in self.spec.args or k in self.spec.kwonlyargs
|
||||
}
|
||||
return {k: kwargs[k] for k in self.params if k in kwargs}
|
||||
|
||||
async def call(self, *args: Any, **kwargs: Any) -> Any:
|
||||
wrapped = partial(self.callback, *args, **self._prepare_kwargs(kwargs))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue