数据类的 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.OK
是 HTTPStatus
IntEnum 子类的成员:
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)
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
我正在 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.OK
是 HTTPStatus
IntEnum 子类的成员:
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)
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