使用通用参数作为文字

Use a generic parameter as a Literal

我正在尝试创建一个 api,我有不同的函数来处理对 api 的请求。

某些方法 return 一个 204 响应,我想将方法​​的 return 类型提示为状态代码为 201 的响应。

def something() -> Response[204]:
    ...

我想创建一个真正的 Response class 的子 class 将被 returned,然后只需设置 status_code 变量到文字 T.

class Response(Generic[T], TheOtherResponseClass):
    status_code: Literal[T]

我现在的问题是,如果可能的话,如何从 typing 模块中获取通用参数 TLiteral 对象一起使用?

这是我能想到的最接近的:

from typing import Generic, Literal, TypeVar

class TheOtherResponseClass:
    status_code: int

T = TypeVar('T', bound=int)

class Response(Generic[T], TheOtherResponseClass):
    status_code: T

class Response204(Response[Literal[204]]):
    status_code: Literal[204] = 204

reveal_type(Response204.status_code)

运行 mypy 在那个文件上会给你

note: Revealed type is "Literal[204]"