首页 > 解决方案 > 数据类的 IntEnum 属性的正确类型提示?

问题描述

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

from dataclasses import dataclass
from http import HTTPStatus


@dataclass
class APICallResult:
    response_text: str
    http_status: HTTPStatus

当我尝试创建此类的对象时,如下所示:

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

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

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

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

标签: pythonenumspycharmpython-typingpython-dataclasses

解决方案


HTTPStatus.OKHTTPStatusIntEnum 子类的成员:

类 http.HTTPStatus

enum.IntEnum 的子类,它定义了一组 HTTP 状态代码、原因短语和用英语编写的长描述。

您得到的错误是 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 不发出警告

Success: no issues found in 1 source file

如果您尝试像这样注释 dataclass 属性:

from dataclasses import dataclass
from http import HTTPStatus


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


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

mypy 给出以下警告

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

PEP 586 -- Literal Types 中给出了注解 Enum 成员的规则:

类型检查时字面量的合法参数

Literal[Color.RED] # 假设 Color 是一些枚举


推荐阅读