python - 数据类的 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
这里可能是一个尴尬的选择。
解决方案
HTTPStatus.OK
是HTTPStatus
IntEnum 子类的成员:
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)
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)
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 是一些枚举
推荐阅读
- java - 获取错误 java.lang.IllegalArgumentException:前缀 wsdp 未绑定到命名空间
- r - 我已经矢量化了一个自定义函数,为什么外部给我一个错误?
- c# - WPF. Button.IsDefault = true. Without UpdateSourceTrigger=PropertyChanged
- python - 提取包含法语单词“mais”的句子返回不包含它的句子
- python - Adding custom dllmain to cythonized module
- openmdao - 有没有办法通过在 OpenMDAO 中创建 XDSM 图来扩展组?
- javascript - 使用 JavaScript 禁用元素
- javascript - setTimeout 是跨天安排任务的正确选项吗?
- c# - 如何在 mvc 中获取当前模型项
- c# - 当没有字节写入超过给定时间段时如何取消流 CopyToAsync