Вопрос о вводе функции, возвращающей класс данных [закрыто]Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Вопрос о вводе функции, возвращающей класс данных [закрыто]

Сообщение Anonymous »

Это может быть небольшая проблема XY, поэтому я открыт для любых предложений.
Я использую классы данных в проекте 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"])

если я запущу mypy в этом модуле, я получу две ошибки:

Код: Выделить всё

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 или другим средствам проверки типов, что возвращаемый тип является оберткой List, а не Dict, без создания подклассов?


Подробнее здесь: https://stackoverflow.com/questions/786 ... -dataclass
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»