mirror of
https://github.com/aiogram/aiogram.git
synced 2026-04-08 16:37:47 +00:00
Add TypedDict support for middleware context data
Introduced `MiddlewareData` and associated TypedDicts to type-hint middleware context data. Updated documentation to include usage examples and guidelines for extending the default middleware data. Also adjusted coverage configuration to exclude the new data module.
This commit is contained in:
parent
8b4976b3de
commit
3232f6067e
4 changed files with 138 additions and 1 deletions
|
|
@ -70,3 +70,61 @@ The last way is to return a dictionary from the filter:
|
|||
.. literalinclude:: ../../examples/context_addition_from_filter.py
|
||||
|
||||
...or using :ref:`MagicFilter <magic-filters>` with :code:`.as_(...)` method.
|
||||
|
||||
|
||||
Using type hints
|
||||
================
|
||||
|
||||
.. note::
|
||||
|
||||
Type-hinting middleware data is optional and is not required for the correct operation of the dispatcher.
|
||||
However, it is recommended to use it to improve the readability of the code.
|
||||
|
||||
You can use type hints to specify the type of the context data in the middlewares, filters and handlers.
|
||||
|
||||
The default middleware data typed dict can be found in :class:`aiogram.dispatcher.middlewares.data.MiddlewareData`.
|
||||
|
||||
In case when you have extended the context data, you can use the :class:`aiogram.dispatcher.middlewares.data.MiddlewareData` as a base class and specify the type hints for the new fields.
|
||||
|
||||
.. warning::
|
||||
|
||||
If you using type checking tools like mypy, you can experience warnings about that this type hint against Liskov substitution principle in due stricter type is not a subclass of :code:`dict[str, Any]`.
|
||||
This is a known issue and it is not a bug. You can ignore this warning or use :code:`# type: ignore` comment.
|
||||
|
||||
Example of using type hints:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
from aiogram.dispatcher.middlewares.data import MiddlewareData
|
||||
|
||||
|
||||
class MyMiddlewareData(MiddlewareData, total=False):
|
||||
my_custom_value: int
|
||||
|
||||
|
||||
class MyMessageMiddleware(BaseMiddleware):
|
||||
async def __call__(
|
||||
self,
|
||||
handler: Callable[[Message, MiddlewareData], Awaitable[Any]],
|
||||
event: Message,
|
||||
data: MiddlewareData,
|
||||
) -> Any:
|
||||
bot = data["bot"] # <-- IDE will show you that data has `bot` key and its type is `Bot`
|
||||
|
||||
data["my_custom_value"] = 42 # <-- IDE will show you that you can set `my_custom_value` key with int value and warn you if you try to set it with other type
|
||||
return await handler(event, data))
|
||||
|
||||
|
||||
Available context data type helpers
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. autoclass:: aiogram.dispatcher.middlewares.data.MiddlewareData
|
||||
:members:
|
||||
:undoc-members:
|
||||
:member-order: bysource
|
||||
|
||||
|
||||
.. autoclass:: aiogram.dispatcher.middlewares.data.I18nData
|
||||
:members:
|
||||
:undoc-members:
|
||||
:member-order: bysource
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue