A rust-like result type for Python
Project description
Resultify
This is an opinionated, simplified fork of dbrgn/result.
Result is a simple, type annotated Result type for Python 3.8+ inspired by Rust.
The idea is that a result value can be either Ok(value)
or Err(error)
, with a way to differentiate between the two. Ok
and Err
are both classes wrapping an arbitrary value. Result[T, E]
is a generic type alias for typing.Union[Ok[T], Err[E]]
.
Requires Python 3.8 or higher!
Caveats
Not all methods have been implemented, only the ones that make sense in the Python context. For example, the map
methods have been omitted, because they don't quite make sense without Rust's pattern matching.
Since Rust's Optional type does not meaningfully translate to Python in a way type checkers are able to understand, ok()
corresponds to unwrap()
and err()
corresponds to unwrap_err()
. On the other side, you don't have to return semantically unclear tuples anymore.
By using .is_ok()
and is_err()
to check for Ok
or Err
you get type safe access to the contained value. All of this in a package allowing easier handling of values that can be OK or not, without resorting to custom exceptions.
API
Creating an instance:
>>> from resultify import Ok, Err
>>> ok = Ok('yay')
>>> res2 = Err('nay')
Type safe checking whether a result is Ok
or Err
.
>>> res = Ok('yay')
>>> res.is_ok()
True
>>> res.is_err()
False
Unwrap a Result
, or raise if trying to extract a result from an error from a result or vice-versa:
>>> ok = Ok('yay')
>>> err = Err('nay')
>>> ok.ok()
'yay'
>>> ok.err()
resultify.UnwrapError: Cannot unwrap error from Ok: Ok('yay')
>>> err.err()
'nay'
>>> err.ok()
resultify.UnwrapError: Cannot unwrap value from Err: Err('nay')
For your convenience, and to appease the type checkers, simply creating an Ok
result without value is the same as using True
:
>>> ok = Ok()
>>> ok.ok()
True
To easily convert a function to return Result
, you can use resultify()
:
>>> from resultify import resultify
>>> @resultify()
... def a():
... return "value"
...
>>> a()
Ok('value')
You can similarly auto-capture exceptions using resultify(...)
. Please note that you can provide multiple exceptions, or none if you don't want to catch the exception! This is primarily useful when modeling code paths with a single good branch and multiple early raise
s, where one does not have to concern oneself with annoying try ... catch ...
statements.
>>> @resultify(TypeError)
... def foo():
... raise TypeError()
...
>>> foo()
Err(TypeError())
Since documentation always lies, please refer to the unit tests for examples of usage.
License
MIT License
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file resultify-1.0.0.tar.gz
.
File metadata
- Download URL: resultify-1.0.0.tar.gz
- Upload date:
- Size: 4.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.4.1 importlib_metadata/4.6.1 pkginfo/1.7.0 requests/2.24.0 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.8.10
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4f4e80b8068cd69cb2e1d637574db818908de1f7b07e69213a96e042cc9f0463 |
|
MD5 | 66f8c2191b2e32e282d75682f17b06c6 |
|
BLAKE2b-256 | 97c46a32491182df5489fce15dbbbe3e492e92380cb0bb8bc923a4c9670cf07d |
File details
Details for the file resultify-1.0.0-py2-none-any.whl
.
File metadata
- Download URL: resultify-1.0.0-py2-none-any.whl
- Upload date:
- Size: 4.6 kB
- Tags: Python 2
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.4.1 importlib_metadata/4.6.1 pkginfo/1.7.0 requests/2.24.0 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.8.10
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 77b0577ba09b30f8ac100f78ce489437af571ad473add15386539408f77e27c1 |
|
MD5 | bca9bf5229a6b45d749c150f6dd008f5 |
|
BLAKE2b-256 | a1989683567737e8a8da81a3efd165283ba37f14f7b0effa7dad98ff28638606 |