From 9a83dedf30bbe3d7f26659118d5d66f44ba78125 Mon Sep 17 00:00:00 2001 From: Sahas Subramanian Date: Mon, 15 May 2023 16:27:57 +0200 Subject: [PATCH 1/2] Remove unused generic type in Actor decorator Signed-off-by: Sahas Subramanian --- src/frequenz/sdk/actor/_decorator.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/frequenz/sdk/actor/_decorator.py b/src/frequenz/sdk/actor/_decorator.py index dd105b432..cb8ee360c 100644 --- a/src/frequenz/sdk/actor/_decorator.py +++ b/src/frequenz/sdk/actor/_decorator.py @@ -12,14 +12,12 @@ import asyncio import inspect import logging -from typing import Any, Generic, Optional, Type, TypeVar +from typing import Any, Optional, Type, TypeVar from frequenz.sdk._internal._asyncio import cancel_and_await _logger = logging.getLogger(__name__) -OT = TypeVar("OT") - def _check_run_method_exists(cls: Type[Any]) -> None: """Check if a run method exists in the given class. @@ -180,7 +178,7 @@ async def run(self) -> None: _check_run_method_exists(cls) - class ActorClass(cls, BaseActor, Generic[OT]): # type: ignore + class ActorClass(cls, BaseActor): # type: ignore """A wrapper class to make an actor.""" def __init__(self, *args: Any, **kwargs: Any) -> None: From dc6cd2cbe2b2437cbd640e15488ea30760bf8ea8 Mon Sep 17 00:00:00 2001 From: Sahas Subramanian Date: Mon, 15 May 2023 16:28:25 +0200 Subject: [PATCH 2/2] Use `ParamSpec` to improve typing for actors Previously, the actor decorator was returning `typing.Any` objects. This commit introduces a `ParamSpec` and a `TypeVar`, to improve typing of actor params, and returned type. Signed-off-by: Sahas Subramanian --- src/frequenz/sdk/actor/_decorator.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/frequenz/sdk/actor/_decorator.py b/src/frequenz/sdk/actor/_decorator.py index cb8ee360c..5e42ab5b6 100644 --- a/src/frequenz/sdk/actor/_decorator.py +++ b/src/frequenz/sdk/actor/_decorator.py @@ -12,7 +12,9 @@ import asyncio import inspect import logging -from typing import Any, Optional, Type, TypeVar +from typing import Any, Callable, Optional, Type, TypeVar + +from typing_extensions import ParamSpec from frequenz.sdk._internal._asyncio import cancel_and_await @@ -55,7 +57,11 @@ class BaseActor: restart_limit: Optional[int] = None -def actor(cls: Type[Any]) -> Type[Any]: +_P = ParamSpec("_P") +_R = TypeVar("_R") + + +def actor(cls: Callable[_P, _R]) -> Type[_R]: """Decorate a class into a simple composable actor. A actor using the `actor` decorator should define an `async def run(self)` @@ -181,7 +187,7 @@ async def run(self) -> None: class ActorClass(cls, BaseActor): # type: ignore """A wrapper class to make an actor.""" - def __init__(self, *args: Any, **kwargs: Any) -> None: + def __init__(self, *args: _P.args, **kwargs: _P.kwargs) -> None: """Create an `ActorClass` instance. Also call __init__ on `cls`.