diff --git a/homeassistant/components/kodi/media_player.py b/homeassistant/components/kodi/media_player.py index 0e254a7d209..0e6d51ba3cd 100644 --- a/homeassistant/components/kodi/media_player.py +++ b/homeassistant/components/kodi/media_player.py @@ -1,16 +1,18 @@ """Support for interfacing with the XBMC/Kodi JSON-RPC API.""" from __future__ import annotations +from collections.abc import Awaitable, Callable, Coroutine from datetime import timedelta from functools import wraps import logging import re -from typing import Any +from typing import Any, TypeVar import urllib.parse import jsonrpc_base from jsonrpc_base.jsonrpc import ProtocolError, TransportError from pykodi import CannotConnectError +from typing_extensions import Concatenate, ParamSpec import voluptuous as vol from homeassistant.components import media_source @@ -86,6 +88,9 @@ from .const import ( EVENT_TURN_ON, ) +_KodiEntityT = TypeVar("_KodiEntityT", bound="KodiEntity") +_P = ParamSpec("_P") + _LOGGER = logging.getLogger(__name__) EVENT_KODI_CALL_METHOD_RESULT = "kodi_call_method_result" @@ -243,11 +248,13 @@ async def async_setup_entry( async_add_entities([entity]) -def cmd(func): +def cmd( + func: Callable[Concatenate[_KodiEntityT, _P], Awaitable[Any]] +) -> Callable[Concatenate[_KodiEntityT, _P], Coroutine[Any, Any, None]]: """Catch command exceptions.""" @wraps(func) - async def wrapper(obj, *args, **kwargs): + async def wrapper(obj: _KodiEntityT, *args: _P.args, **kwargs: _P.kwargs) -> None: """Wrap all command methods.""" try: await func(obj, *args, **kwargs)