python的类锈结果类型

result的Python项目详细描述


Build statusCoverage

python 3inspired by Rust的简单结果类型。

其思想是Result值可以是Ok(value)Err(error), 有办法区分两者。它将更改如下代码:

defget_user_by_email(email):"""
    Return the user instance or an error message.
    """ifnotuser_exists(email):returnNone,'User does not exist'ifnotuser_active(email):returnNone,'User is inactive'user=get_user(email)returnuser,Noneuser,reason=get_user_by_email('ueli@example.com')ifuserisNone:raiseRuntimeError('Could not fetch user: %s'%reason)else:do_something(user)

像这样:

fromresultimportOk,Errdefget_user_by_email(email):"""
    Return the user instance or an error message.
    """ifnotuser_exists(email):returnErr('User does not exist')ifnotuser_active(email):returnErr('User is inactive')user=get_user(email)returnOk(user)user_result=get_user_by_email(email)ifuser_result.is_ok():do_something(user_result.value)else:raiseRuntimeError('Could not fetch user: %s'user_result.value)

因为这是python而不是rust,所以您将失去它的一些优点 带来了match语句的优雅组合。另一方面 你不必再返回语义不清的元组了。

不是所有的方法(https://doc.rust-lang.org/std/result/enum.Result.html)都有 已经实现,只有那些在python上下文中有意义的。你还是 不需要任何类型的安全性,但是可以更容易地处理类型 不,除非求助于自定义异常。

API

创建实例:

>>> from result import Ok, Err
>>> res1 = Ok('yay')
>>> res2 = Err('nay')

或者通过类方法:

>>> from result import Result
>>> res1 = Result.Ok('yay')
>>> res2 = Result.Err('nay')

检查结果是否正常:

>>> res = Ok('yay')
>>> res.is_ok()
True
>>> res.is_err()
False

将结果转换为值或None

>>> res1 = Ok('yay')
>>> res2 = Err('nay')
>>> res1.ok()
'yay'
>>> res2.ok()
None

将结果转换为错误或None

>>> res1 = Ok('yay')
>>> res2 = Err('nay')
>>> res1.err()
None
>>> res2.err()
'nay'

直接访问值,无需任何其他检查:

>>> res1 = Ok('yay')
>>> res2 = Err('nay')
>>> res1.value
'yay'
>>> res2.value
'nay'

请注意,这是一个属性,您不能将其指定给它。结果是不可变的。

为了方便起见,只需创建一个不带值的ok结果,就等同于使用true

>>> res1 = Result.Ok()
>>> res1.value
True
>>> res2 = Ok()
>>> res2.value
True

如果ok,则unwrap方法返回值,否则将引发unwraper

>>> res1 = Ok('yay')
>>> res2 = Err('nay')
>>> res1.unwrap()
'yay'
>>> res2.unwrap()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\project\result\result.py", line 107, in unwrap
    return self.expect("Called `Result.unwrap()` on an `Err` value")
File "C:\project\result\result.py", line 101, in expect
    raise UnwrapError(message)
result.result.UnwrapError: Called `Result.unwrap()` on an `Err` value

可以使用expect显示自定义错误消息:

>>> res1 = Ok('yay')
>>> res2 = Err('nay')
>>> res1.expect('not ok')
'yay'
>>> res2.expect('not ok')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\project\result\result.py", line 101, in expect
    raise UnwrapError(message)
result.result.UnwrapError: not ok

可以使用unwrap_或返回默认值:

>>> res1 = Ok('yay')
>>> res2 = Err('nay')
>>> res1.unwrap_or('default')
'yay'
>>> res2.unwrap_or('default')
'default'

许可证

麻省理工学院许可证

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java为什么需要ScheduledExecutorService。shutdown()使用我100%的CPU吗?   java如何加载应用程序。spring框架中的属性?   java立即绘制JFrame   java定时器不允许用户进行编辑   java如何通过在React应用程序中提交值来加载数据   java在Multimultiul maven项目中集成特性(文件)存储在哪里?   java Arjuna JTA事务意外回滚   java禁用edittext 安卓,在视图中使用if-else   java中的错误。图书馆从Matlab调用使用Cplex的Java函数时的路径   Java中的浮点计算错误   Java中C#IEnumerable的等价物是什么?是可协变的,不是可协变的   最终播放商店用户可见的java Apk名称