Skip to content
BoWen Chai's Notes
Go back

Python Code Type Hints Snippets

Edit page

Typst

Table of Contents

Open Table of Contents

Type Hints for decorator that wrap async functions

def decorator_f[**P, T](func: Callable[P, Awaitable[T]]) -> Callable[P, Awaitable[T]]:
    @wraps(func)
    async def wrapper(*args: P.args, **kwargs: P.kwargs) -> T:
        needed_parameters: NeededParameters | None = None

        for arg in args:
            if isinstance(arg, NeededParameters):
                needed_parameters = arg
                break

        if needed_parameters is None:
            needed_parameters = kwargs.get('needed_parameters')

        if needed_parameters is None:
            raise ValueError("No NeededParameters provided")

        # ...

        return await func(*args, **kwargs)

Annotate a function to provide information like Auth

def require_auth(authorization: Annotated[str | None, Header()] = None) -> None:
    if authorization is None:
        raise HTTPException(status_code=401, detail="Authorization header missing")

    if not authorization.startswith("Bearer "):
        raise HTTPException(status_code=401, detail="Invalid authorization format")

    token = authorization[7:]

    verify_result = auth_provider.verify_token(token)

    if verify_result.not.passed:
        raise HTTPException(status_code=401, detail="Invalid token")

and for function that need auth

@router.get("/protected-endpoint")
def need_auth(
    _: Anotated[None, Depends(require_auth)],
) -> ...:
    ...

or you could add to the api

@router.get("/protected-endpoint", dependencies=[Depends(require_auth)])
def need_auth() -> ...:
    ...

Compare to using decorator, using annotated is more convient, and easy to add type hints.


Edit page
Share this post:

Previous Post
One Tab failed to load on Chrome
Next Post
Some Tricks for Doing Web Dev