aws-powertools / powertools-lambda-python

A developer toolkit to implement Serverless best practices and increase developer velocity.
https://docs.powertools.aws.dev/lambda/python/latest/
MIT No Attribution
2.78k stars 386 forks source link

Static typing: APIGatewayRestResolver `.post()` decorator return type Unknown #3990

Open rafrafek opened 5 months ago

rafrafek commented 5 months ago

Static type checker used

pyright/pylance

AWS Lambda function runtime

3.12

Powertools for AWS Lambda (Python) version

latest

Static type checker info

Latest Pylance, latest VS Code, type checking mode strict.

Untyped function decorator obscures type of function

Screenshot:

image

Code snippet

from aws_lambda_powertools.event_handler import APIGatewayRestResolver

app = APIGatewayRestResolver()

@app.post("/v1/demo")
def demo() -> str:
    return "demo"

Possible Solution

return Callable[..., T] or something like that

rafrafek commented 5 months ago

I think the solution may look similar to this:

from typing import Any, Callable, TypeVar

T_route = TypeVar("T_route", bound=Callable[..., Any])

class Resolver:

    def route(self, rule: str, method: str) -> Callable[[T_route], T_route]:

        def register_resolver(func: T_route) -> T_route:
            print(rule, method)
            return func

        return register_resolver

    def post(self, rule: str) -> Callable[[T_route], T_route]:
        return self.route(rule=rule, method="POST")

app = Resolver()

@app.route("/v1/demo", "GET")
def demo() -> str:
    return "demo"

@app.post("/v1/demo_post")
def demo_post() -> str:
    return "demo post"
leandrodamascena commented 5 months ago

Hello @rafrafek! Thanks for opening this issue! I'm planning to review this next week.

heitorlessa commented 2 months ago

Adding help wanted label as we were unable to prioritize it. Any PR welcome <3