python的类锈结果类型
result的Python项目详细描述
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'
许可证
麻省理工学院许可证