Я использую классы данных в проекте Python3.11 в качестве тонкий тип возврата вокруг кода состояния и ответа на некоторую операцию (каждая из которых представлена определенной функцией) и, возможно, идентификатор данных, на которые есть ссылка в базе данных. Я делаю это, чтобы стандартизировать тип возвращаемого значения.
Мне нравится интерфейс класса данных больше, чем именованные кортежи, а именованные кортежи лучше, чем кортежи.
Код состояния всегда имеет тип int, тогда как ответ зависит от типа операции и результата.
Операция может быть успешной, и в этом случае мне нужно вернуть данные, которые могут быть массивом или картой, или это может привести к сбою, и в этом случае я хотел бы указать причину сбоя.
Вот моя реализация:
Код: Выделить всё
from dataclasses import dataclass
from typing import Any, List, Dict
@dataclass(frozen=True)
class OperationResult:
status_code: int
response: str | List | Dict
id: int | None = None
РЕДАКТИРОВАТЬ:
спасибо всем за комментарии, извините за неполноту.
Вот пример, который поможет объяснить:
Код: Выделить всё
from dataclasses import dataclass
from typing import List, Dict
@dataclass(
frozen=True,
)
class OperationResult:
status_code: int
response: str | List | Dict
id: int | None = None
def operation1(a, b) -> OperationResult:
# Do stuff
try:
res = a / b
except ZeroDivisionError:
return OperationResult(500, "Failed")
else:
return OperationResult(200, {"response": res})
def operation2(a, b) -> OperationResult:
# Do stuff
try:
res = a / b
except ZeroDivisionError:
return OperationResult(500, "Failed")
else:
return OperationResult(200, [res])
result1 = operation1(1, 2)
if result1.status_code == 200:
print(result1.response["response"])
result2 = operation2(1, 2)
if result2.status_code == 200:
print(result2.response["response"])
Код: Выделить всё
error: Invalid index type "str" for "str | list[Any] | dict[Any, Any]"; expected type "SupportsIndex | slice" [index]
Код: Выделить всё
result1 = operation1(1, 2)
if result1.status_code == 200:
print(result1.response[0])
result2 = operation2(1, 2)
if result2.status_code == 200:
print(result2.response[0])
Код: Выделить всё
mypy
В конце концов, есть ли способ сообщить mypy или другим средствам проверки типов, что возвращаемый тип является оберткой List, а не Dict, без создания подклассов?
Подробнее здесь: https://stackoverflow.com/questions/786 ... -dataclass