Подсказка по условному типуPython

Программы на Python
Anonymous
Подсказка по условному типу

Сообщение Anonymous »

Я использую шаблон, согласно которому все мои адаптеры возвращают объекты Result вместо самого результата. Позвольте мне объяснить:

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

from typing import Generic, Optional, TypeVar
from pydantic import BaseModel

Dto = TypeVar("Dto", bound=BaseModel)

class Result(BaseModel, Generic[Dto]):
error: Optional[Exception]
data: Optional[Dto]

@property
def is_success(self) -> bool:
return bool(self.data) and not self.error

class Config:
arbitrary_types_allowed = True

def adapter_example(input: Any) -> Result[int]:
try:
# some complex stuff here
result = Result[int](data=10)
except SomethingBad as e:
return Result[int](error=e)
Дело в том, что проверка наличия ошибки None не гарантирует мне, что данные != None. Есть ли способ заставить хотя бы (и условно) один из них быть обязательным (или не необязательным)?
Например:

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

Result[str](data='a')                       # VALID
Result[str](error=Exception())              # VALID
Result[str](data='', error=Exception())     # VALID
Result[str]()                               # INVALID

if result.data:
# Here any linter are 100% sure that result.error is None
else:
# Here any linter  are 100% sure that result.error != None
ps: я использую здесь только pydantic.BaseModel, потому что в этой реализации это проще. Если у вас есть какие-либо предложения о том, как условно ввести этот класс, не используйте pydantic, я согласен


Подробнее здесь: https://stackoverflow.com/questions/728 ... -type-hint

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