【问题标题】:Proper type hint for IntEnum attribute of dataclass?数据类的 IntEnum 属性的正确类型提示?
【发布时间】:2021-05-26 00:15:52
【问题描述】:

我正在 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 在这里可能是一个尴尬的选择。

【问题讨论】:

  • 这让我觉得是 Pycharm 的分析实现中的一个错误(有几个)。我希望你已经是正确的。
  • @Carcigenicate 啊,我没想到。我尝试使用 mypy,它没有发现我的代码有任何问题。

标签: python enums pycharm python-typing python-dataclasses


【解决方案1】:

HTTPStatus.OKHTTPStatus IntEnum 子类的成员:

class 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 issues no warning

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 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 -- Literal Types 中给出:

Legal parameters for Literal at type check time

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

【讨论】:

  • 感谢您的详细解答!在我对 mypy 的实验中,http_status: HTTPStatus 对我有用。我不愿意在这里使用Literal,因为API 可能会返回HTTPStatus.OK 以外的其他状态码。
  • @JerryWang 写的比较着急,今天晚些时候再写。
猜你喜欢
  • 2019-02-20
  • 2020-10-24
  • 2021-10-27
  • 1970-01-01
  • 2021-12-14
  • 2018-04-21
  • 1970-01-01
  • 2019-03-26
  • 2021-02-23
相关资源
最近更新 更多