171 lines
4.3 KiB
Python
171 lines
4.3 KiB
Python
"""
|
|
Result 类型用于优雅的错误处理
|
|
|
|
提供受 Rust 启发的 Result<T, E> 类型,用于处理可能失败的操作而无需使用异常。
|
|
|
|
使用示例:
|
|
# 成功情况
|
|
def get_user(user_id: str) -> Result[User]:
|
|
user = db.find_user(user_id)
|
|
if user:
|
|
return Ok(user)
|
|
return Err(ErrorCodes.USER_NOT_FOUND)
|
|
|
|
# 使用结果
|
|
result = get_user("123")
|
|
if result.is_ok():
|
|
user = result.unwrap()
|
|
print(f"User: {user.name}")
|
|
else:
|
|
error = result.unwrap_err()
|
|
print(f"Error: {error.message}")
|
|
"""
|
|
from typing import Generic, TypeVar, Optional, Any
|
|
|
|
from .base import ErrorCode
|
|
from .codes import ErrorCodes
|
|
|
|
T = TypeVar('T') # 成功类型
|
|
E = TypeVar('E', bound=ErrorCode) # 错误类型
|
|
|
|
|
|
class Result(Generic[T, E]):
|
|
"""
|
|
表示成功(Ok)或失败(Err)的 Result 类型
|
|
|
|
此类型允许在不需要异常的情况下进行显式错误处理
|
|
"""
|
|
|
|
def __init__(self, value: Optional[T], error: Optional[E], is_ok: bool):
|
|
self._value = value
|
|
self._error = error
|
|
self._is_ok = is_ok
|
|
|
|
@staticmethod
|
|
def ok(value: T) -> 'Result[T, E]':
|
|
"""创建一个包含值的成功结果"""
|
|
return Result(value, None, True)
|
|
|
|
@staticmethod
|
|
def err(error: E) -> 'Result[T, E]':
|
|
"""创建一个包含错误码的失败结果"""
|
|
return Result(None, error, False)
|
|
|
|
@property
|
|
def is_ok(self) -> bool:
|
|
"""检查结果是否成功"""
|
|
return self._is_ok
|
|
|
|
@property
|
|
def is_err(self) -> bool:
|
|
"""检查结果是否失败"""
|
|
return not self._is_ok
|
|
|
|
def unwrap(self) -> T:
|
|
"""
|
|
获取成功值
|
|
|
|
Returns:
|
|
成功值
|
|
|
|
Raises:
|
|
ValueError: 如果结果是错误
|
|
"""
|
|
if self._is_ok:
|
|
return self._value
|
|
raise ValueError(
|
|
f"Cannot unwrap error result: {self._error.message}"
|
|
)
|
|
|
|
def unwrap_err(self) -> E:
|
|
"""
|
|
获取错误码
|
|
|
|
Returns:
|
|
错误码
|
|
|
|
Raises:
|
|
ValueError: 如果结果是成功的
|
|
"""
|
|
if not self._is_ok:
|
|
return self._error
|
|
raise ValueError("Cannot unwrap error from successful result")
|
|
|
|
def unwrap_or(self, default: T) -> T:
|
|
"""
|
|
获取成功值,如果出错则返回默认值
|
|
|
|
Args:
|
|
default: 出错时返回的默认值
|
|
|
|
Returns:
|
|
成功值或默认值
|
|
"""
|
|
return self._value if self._is_ok else default
|
|
|
|
def map(self, func) -> 'Result[Any, E]':
|
|
"""
|
|
如果存在成功值,则应用函数
|
|
|
|
Args:
|
|
func: 要应用的函数
|
|
|
|
Returns:
|
|
包含映射值的新结果或相同的错误
|
|
"""
|
|
if self._is_ok:
|
|
try:
|
|
return Result.ok(func(self._value))
|
|
except Exception:
|
|
# 如果映射失败,转换为错误
|
|
return Result.err(ErrorCodes.INTERNAL_ERROR)
|
|
return self
|
|
|
|
def and_then(self, func) -> 'Result[Any, E]':
|
|
"""
|
|
链式调用返回 Result 的操作
|
|
|
|
Args:
|
|
func: 接收成功值并返回新 Result 的函数
|
|
|
|
Returns:
|
|
来自函数的新结果或相同的错误
|
|
"""
|
|
if self._is_ok:
|
|
return func(self._value)
|
|
return self
|
|
|
|
def or_else(self, func) -> 'Result[T, Any]':
|
|
"""
|
|
在出错时提供备用结果
|
|
|
|
Args:
|
|
func: 接收错误并返回新 Result 的函数
|
|
|
|
Returns:
|
|
相同的结果或来自函数的新结果
|
|
"""
|
|
if not self._is_ok:
|
|
return func(self._error)
|
|
return self
|
|
|
|
|
|
def Ok(value: T) -> Result[T, ErrorCode]:
|
|
"""
|
|
创建一个成功的结果
|
|
|
|
使用示例:
|
|
return Ok(user_data)
|
|
"""
|
|
return Result.ok(value)
|
|
|
|
|
|
def Err(error_code: ErrorCode) -> Result[Any, ErrorCode]:
|
|
"""
|
|
创建一个失败的结果
|
|
|
|
使用示例:
|
|
return Err(ErrorCodes.USER_NOT_FOUND)
|
|
"""
|
|
return Result.err(error_code)
|