diff --git a/aiogram/dispatcher/_typedef.py b/aiogram/dispatcher/_typedef.py new file mode 100644 index 00000000..03928ce3 --- /dev/null +++ b/aiogram/dispatcher/_typedef.py @@ -0,0 +1,6 @@ +from typing import TYPE_CHECKING, Any, Mapping, TypeVar + +if TYPE_CHECKING: + StorageDataT = TypeVar("StorageDataT", bound=Mapping[str, Any]) +else: + StorageDataT = TypeVar("StorageDataT", bound=Mapping) diff --git a/aiogram/dispatcher/dispatcher.py b/aiogram/dispatcher/dispatcher.py index a51ee315..e7f2109c 100644 --- a/aiogram/dispatcher/dispatcher.py +++ b/aiogram/dispatcher/dispatcher.py @@ -4,23 +4,14 @@ import asyncio import contextvars import warnings from asyncio import CancelledError, Future, Lock -from typing import ( - TYPE_CHECKING, - Any, - AsyncGenerator, - Dict, - Generic, - Mapping, - Optional, - TypeVar, - Union, -) +from typing import Any, AsyncGenerator, Dict, Generic, Optional, Union from .. import loggers from ..api.client.bot import Bot from ..api.methods import TelegramMethod from ..api.types import Chat, Update, User from ..utils.exceptions import TelegramAPIError +from ._typedef import StorageDataT from .event.bases import NOT_HANDLED from .middlewares.user_context import UserContextMiddleware from .router import Router @@ -28,13 +19,8 @@ from .state.context import CurrentUserContext from .storage.base import BaseStorage from .storage.dummy import DummyStorage -if TYPE_CHECKING: - _StorageDataT = TypeVar("_StorageDataT", bound=Mapping[str, Any]) -else: - _StorageDataT = TypeVar("_StorageDataT", bound=Mapping) - -class Dispatcher(Router, Generic[_StorageDataT]): +class Dispatcher(Router, Generic[StorageDataT]): """ Root router """ @@ -42,7 +28,7 @@ class Dispatcher(Router, Generic[_StorageDataT]): def __init__( self, use_builtin_filters: bool = True, - storage: Optional[BaseStorage[_StorageDataT]] = None, + storage: Optional[BaseStorage[StorageDataT]] = None, ) -> None: super(Dispatcher, self).__init__(use_builtin_filters=use_builtin_filters,) self._running_lock = Lock() @@ -52,7 +38,7 @@ class Dispatcher(Router, Generic[_StorageDataT]): self.storage = storage @property - def current_state(self) -> CurrentUserContext[_StorageDataT]: + def current_state(self) -> CurrentUserContext[StorageDataT]: if self.storage is None: self.storage: DummyStorage = DummyStorage() # type: ignore diff --git a/aiogram/dispatcher/state/context.py b/aiogram/dispatcher/state/context.py index 9f55e443..4bc48472 100644 --- a/aiogram/dispatcher/state/context.py +++ b/aiogram/dispatcher/state/context.py @@ -1,11 +1,8 @@ -from typing import TYPE_CHECKING, Any, Callable, Dict, Generic, Mapping, Optional, TypeVar +from typing import Any, Callable, Dict, Generic, Mapping, Optional from aiogram.dispatcher.storage.base import BaseStorage -if TYPE_CHECKING: - DataT = TypeVar("DataT", bound=Mapping[str, Any]) -else: - DataT = TypeVar("DataT", bound=Mapping) +from .._typedef import StorageDataT def _default_key_maker(chat_id: Optional[int] = None, user_id: Optional[int] = None) -> str: @@ -19,12 +16,12 @@ def _default_key_maker(chat_id: Optional[int] = None, user_id: Optional[int] = N return f"{chat_id}:{user_id}" -class CurrentUserContext(Generic[DataT]): +class CurrentUserContext(Generic[StorageDataT]): __slots__ = "key", "storage" def __init__( self, - storage: BaseStorage[DataT], + storage: BaseStorage[StorageDataT], chat_id: Optional[int], user_id: Optional[int], key_maker: Callable[[Optional[int], Optional[int]], str] = _default_key_maker, @@ -39,10 +36,10 @@ class CurrentUserContext(Generic[DataT]): async def get_state(self, default: Optional[str] = None) -> Optional[str]: return await self.storage.get_state(self.key, default=default) - async def get_data(self, default: Optional[DataT] = None) -> DataT: + async def get_data(self, default: Optional[StorageDataT] = None) -> StorageDataT: return await self.storage.get_data(self.key, default=default) - async def update_data(self, data: Optional[DataT] = None, **kwargs: Any) -> None: + async def update_data(self, data: Optional[StorageDataT] = None, **kwargs: Any) -> None: if data is not None and not isinstance(data, Mapping): raise ValueError("Data is expected to be a map") # todo @@ -58,7 +55,7 @@ class CurrentUserContext(Generic[DataT]): async def set_state(self, state: Optional[str] = None) -> None: await self.storage.set_state(self.key, state=state) - async def set_data(self, data: Optional[DataT] = None) -> None: + async def set_data(self, data: Optional[StorageDataT] = None) -> None: await self.storage.set_data(self.key, data=data) async def reset_state(self, with_data: bool = True) -> None: