diff --git a/homeassistant/components/http/ban.py b/homeassistant/components/http/ban.py index eec951fb907..b4e949514b8 100644 --- a/homeassistant/components/http/ban.py +++ b/homeassistant/components/http/ban.py @@ -116,7 +116,8 @@ async def process_wrong_login(request: Request) -> None: """ hass = request.app[KEY_HASS] - remote_addr = ip_address(request.remote) # type: ignore[arg-type] + assert request.remote + remote_addr = ip_address(request.remote) remote_host = request.remote with suppress(herror): remote_host, _, _ = await hass.async_add_executor_job( diff --git a/homeassistant/components/meteo_france/__init__.py b/homeassistant/components/meteo_france/__init__.py index e43572ade6c..ddba982934c 100644 --- a/homeassistant/components/meteo_france/__init__.py +++ b/homeassistant/components/meteo_france/__init__.py @@ -54,6 +54,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: async def _async_update_data_alert() -> CurrentPhenomenons: """Fetch data from API endpoint.""" + assert isinstance(department, str) return await hass.async_add_executor_job( client.get_warning_current_phenomenoms, department, 0, True ) diff --git a/homeassistant/core.py b/homeassistant/core.py index cdf5cbfe6a8..533bddb6ceb 100644 --- a/homeassistant/core.py +++ b/homeassistant/core.py @@ -40,6 +40,7 @@ from typing import ( ParamSpec, Self, TypedDict, + TypeVarTuple, cast, overload, ) @@ -135,6 +136,7 @@ _T = TypeVar("_T") _R = TypeVar("_R") _R_co = TypeVar("_R_co", covariant=True) _P = ParamSpec("_P") +_Ts = TypeVarTuple("_Ts") # Internal; not helpers.typing.UNDEFINED due to circular dependency _UNDEF: dict[Any, Any] = {} _CallableT = TypeVar("_CallableT", bound=Callable[..., Any]) @@ -529,7 +531,7 @@ class HomeAssistant: self.bus.async_fire(EVENT_HOMEASSISTANT_STARTED) def add_job( - self, target: Callable[..., Any] | Coroutine[Any, Any, Any], *args: Any + self, target: Callable[[*_Ts], Any] | Coroutine[Any, Any, Any], *args: *_Ts ) -> None: """Add a job to be executed by the event loop or by an executor. @@ -547,7 +549,7 @@ class HomeAssistant: ) return if TYPE_CHECKING: - target = cast(Callable[..., Any], target) + target = cast(Callable[[*_Ts], Any], target) self.loop.call_soon_threadsafe( functools.partial( self.async_add_hass_job, HassJob(target), *args, eager_start=True @@ -558,8 +560,8 @@ class HomeAssistant: @callback def async_add_job( self, - target: Callable[..., Coroutine[Any, Any, _R]], - *args: Any, + target: Callable[[*_Ts], Coroutine[Any, Any, _R]], + *args: *_Ts, eager_start: bool = False, ) -> asyncio.Future[_R] | None: ... @@ -568,8 +570,8 @@ class HomeAssistant: @callback def async_add_job( self, - target: Callable[..., Coroutine[Any, Any, _R] | _R], - *args: Any, + target: Callable[[*_Ts], Coroutine[Any, Any, _R] | _R], + *args: *_Ts, eager_start: bool = False, ) -> asyncio.Future[_R] | None: ... @@ -587,8 +589,9 @@ class HomeAssistant: @callback def async_add_job( self, - target: Callable[..., Coroutine[Any, Any, _R] | _R] | Coroutine[Any, Any, _R], - *args: Any, + target: Callable[[*_Ts], Coroutine[Any, Any, _R] | _R] + | Coroutine[Any, Any, _R], + *args: *_Ts, eager_start: bool = False, ) -> asyncio.Future[_R] | None: """Add a job to be executed by the event loop or by an executor. @@ -623,7 +626,7 @@ class HomeAssistant: # the type used for the cast. For history see: # https://github.com/home-assistant/core/pull/71960 if TYPE_CHECKING: - target = cast(Callable[..., Coroutine[Any, Any, _R] | _R], target) + target = cast(Callable[[*_Ts], Coroutine[Any, Any, _R] | _R], target) return self.async_add_hass_job(HassJob(target), *args, eager_start=eager_start) @overload @@ -772,7 +775,7 @@ class HomeAssistant: @callback def async_add_executor_job( - self, target: Callable[..., _T], *args: Any + self, target: Callable[[*_Ts], _T], *args: *_Ts ) -> asyncio.Future[_T]: """Add an executor job from within the event loop.""" task = self.loop.run_in_executor(None, target, *args) @@ -783,7 +786,7 @@ class HomeAssistant: @callback def async_add_import_executor_job( - self, target: Callable[..., _T], *args: Any + self, target: Callable[[*_Ts], _T], *args: *_Ts ) -> asyncio.Future[_T]: """Add an import executor job from within the event loop.""" task = self.loop.run_in_executor(self.import_executor, target, *args) @@ -844,14 +847,14 @@ class HomeAssistant: @overload @callback def async_run_job( - self, target: Callable[..., Coroutine[Any, Any, _R]], *args: Any + self, target: Callable[[*_Ts], Coroutine[Any, Any, _R]], *args: *_Ts ) -> asyncio.Future[_R] | None: ... @overload @callback def async_run_job( - self, target: Callable[..., Coroutine[Any, Any, _R] | _R], *args: Any + self, target: Callable[[*_Ts], Coroutine[Any, Any, _R] | _R], *args: *_Ts ) -> asyncio.Future[_R] | None: ... @@ -865,8 +868,9 @@ class HomeAssistant: @callback def async_run_job( self, - target: Callable[..., Coroutine[Any, Any, _R] | _R] | Coroutine[Any, Any, _R], - *args: Any, + target: Callable[[*_Ts], Coroutine[Any, Any, _R] | _R] + | Coroutine[Any, Any, _R], + *args: *_Ts, ) -> asyncio.Future[_R] | None: """Run a job from within the event loop. @@ -894,7 +898,7 @@ class HomeAssistant: # the type used for the cast. For history see: # https://github.com/home-assistant/core/pull/71960 if TYPE_CHECKING: - target = cast(Callable[..., Coroutine[Any, Any, _R] | _R], target) + target = cast(Callable[[*_Ts], Coroutine[Any, Any, _R] | _R], target) return self.async_run_hass_job(HassJob(target), *args) def block_till_done(self) -> None: