diff --git a/aiogram/dispatcher/event/handler.py b/aiogram/dispatcher/event/handler.py index 63f5130b..37a9ecb7 100644 --- a/aiogram/dispatcher/event/handler.py +++ b/aiogram/dispatcher/event/handler.py @@ -32,7 +32,9 @@ class CallableMixin: if self.spec.varkw: return kwargs - return {k: v for k, v in kwargs.items() if k in self.spec.args} + return { + k: v for k, v in kwargs.items() if k in self.spec.args or k in self.spec.kwonlyargs + } async def call(self, *args: Any, **kwargs: Any) -> Any: wrapped = partial(self.callback, *args, **self._prepare_kwargs(kwargs)) diff --git a/tests/test_dispatcher/test_event/test_handler.py b/tests/test_dispatcher/test_event/test_handler.py index 168dac59..6bce7d98 100644 --- a/tests/test_dispatcher/test_event/test_handler.py +++ b/tests/test_dispatcher/test_event/test_handler.py @@ -22,6 +22,10 @@ async def callback3(foo: int, **kwargs): return locals() +async def callback4(foo: int, *, bar: int, baz: int): + return locals() + + class Filter(BaseFilter): async def __call__(self, foo: int, bar: int, baz: int) -> Union[bool, Dict[str, Any]]: return locals() @@ -95,11 +99,21 @@ class TestCallableMixin: {"foo": 42, "spam": True, "baz": "fuz", "bar": "test"}, {"foo": 42, "baz": "fuz", "bar": "test"}, ), + pytest.param( + functools.partial(callback2, bar="test"), + {"foo": 42, "spam": True, "baz": "fuz"}, + {"foo": 42, "baz": "fuz"}, + ), pytest.param( callback3, {"foo": 42, "spam": True, "baz": "fuz", "bar": "test"}, {"foo": 42, "spam": True, "baz": "fuz", "bar": "test"}, ), + pytest.param( + callback4, + {"foo": 42, "spam": True, "baz": "fuz", "bar": "test"}, + {"foo": 42, "baz": "fuz", "bar": "test"}, + ), pytest.param( Filter(), {"foo": 42, "spam": True, "baz": "fuz"}, {"foo": 42, "baz": "fuz"} ),