数据类的 IntEnum 属性的正确类型提示?

Proper type hint for IntEnum attribute of dataclass?

我正在 3.8.8 中创建一个数据class 来存储 REST API 调用的结果,它的一个属性用于存储 HTTP 响应状态:

from dataclasses import dataclass
from http import HTTPStatus


@dataclass
class APICallResult:
    response_text: str
    http_status: HTTPStatus

当我尝试创建这个 class 的对象时,如下所示:

result = APICallResult('foo', HTTPStatus.OK)

PyCharm 2020.3.3 只是标记 HTTPStatus.OK 错误:

Expected type 'HTTPStatus', got 'int' instead`.

现在我想知道在这种情况下 IntEnum 的正确类型提示是什么?我认为 Literal 在这里可能是一个尴尬的选择。

HTTPStatus.OKHTTPStatus IntEnum 子类的成员:

class http.HTTPStatus

A subclass of enum.IntEnum that defines a set of HTTP status codes, reason phrases and long descriptions written in English.

你得到的错误是 PyCharm 静态类型检查器中的错误,如果你像下面的例子一样编写属性类型提示并用 mypy 测试它,你会发现没有错误:

from dataclasses import dataclass
from http import HTTPStatus
from typing import Literal


@dataclass
class APICallResult:
    response_text: str
    http_status: Literal[HTTPStatus.OK]


result = APICallResult('foo', HTTPStatus.OK)

mypy issues no warning

Success: no issues found in 1 source file

如果您尝试像这样注释数据类属性:

from dataclasses import dataclass
from http import HTTPStatus


@dataclass
class APICallResult:
    response_text: str
    http_status: HTTPStatus.OK


result = APICallResult('foo', HTTPStatus.OK)

mypy gives the following warning:

main.py:9: error: Invalid type: try using Literal[HTTPStatus.OK] instead?
Found 1 error in 1 file (checked 1 source file)

注释 Enum 成员的规则在 PEP 586 -- 文字类型中给出:

Legal parameters for Literal at type check time

Literal[Color.RED] # Assuming Color is some enum