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窗口的鼠标位置错误   Java 8流peek api   java将数据附加到文件中   java使用ExoPlayer 2.8播放播放列表中的特定文件   JavaSpring国际化:如何动态设置语言环境值   java如何在mysql中实现两个表之间的两个关联   java在gradle可执行jar文件中包含运行时参数   surefire插件中的java maven多套测试套件   java试图理解堆分析以确定内存泄漏或所需的大量内存   java识别字符串有数字   数组如何解决错误“java.lang.ArrayIndexOutOfBoundsException:5”   java Swt文件对话框选择的文件太多?   java此登录代码易受SQL注入攻击吗?   Java[3]中的文件<identifier>预期编译错误   java如何在spring webflux中发送列表   jar中未找到java文件异常   如何在java中合并2D数组?   java如何评测本机JNI库