From 4cf395483f7a8a51e47bc7ece150d2da26de57fe Mon Sep 17 00:00:00 2001 From: Steven B <51370195+sdb9696@users.noreply.github.com> Date: Wed, 12 Jun 2024 20:58:21 +0100 Subject: [PATCH] Add type hints to feature set_value (#974) To prevent untyped call mypy errors in consumers --- kasa/feature.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/kasa/feature.py b/kasa/feature.py index 9863a39b..b992789a 100644 --- a/kasa/feature.py +++ b/kasa/feature.py @@ -10,7 +10,6 @@ from typing import TYPE_CHECKING, Any, Callable if TYPE_CHECKING: from .device import Device - _LOGGER = logging.getLogger(__name__) @@ -140,22 +139,24 @@ class Feature: raise ValueError("Not an action and no attribute_getter set") container = self.container if self.container is not None else self.device - if isinstance(self.attribute_getter, Callable): + if callable(self.attribute_getter): return self.attribute_getter(container) return getattr(container, self.attribute_getter) - async def set_value(self, value): + async def set_value(self, value: int | float | bool | str | Enum | None) -> Any: """Set the value.""" if self.attribute_setter is None: raise ValueError("Tried to set read-only feature.") if self.type == Feature.Type.Number: # noqa: SIM102 + if not isinstance(value, (int, float)): + raise ValueError("value must be a number") if value < self.minimum_value or value > self.maximum_value: raise ValueError( f"Value {value} out of range " f"[{self.minimum_value}, {self.maximum_value}]" ) elif self.type == Feature.Type.Choice: # noqa: SIM102 - if value not in self.choices: + if not self.choices or value not in self.choices: raise ValueError( f"Unexpected value for {self.name}: {value}" f" - allowed: {self.choices}"