Skip to main content

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 raises, 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

resultify-1.0.1.tar.gz (4.5 kB view details)

Uploaded Source

Built Distribution

resultify-1.0.1-py3-none-any.whl (4.5 kB view details)

Uploaded Python 3

File details

Details for the file resultify-1.0.1.tar.gz.

File metadata

  • Download URL: resultify-1.0.1.tar.gz
  • Upload date:
  • Size: 4.5 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.25.1 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.8.10

File hashes

Hashes for resultify-1.0.1.tar.gz
Algorithm Hash digest
SHA256 222710c3dcadb4d404841538562c30241182e13c112fdac6a0653620d1829ea3
MD5 e0b4db1826ceb897458683be91c90eb1
BLAKE2b-256 b2a63623829a8ea9e8fd4bdf43094289cb51e97a176f13b5e69a5b48bc53e27b

See more details on using hashes here.

File details

Details for the file resultify-1.0.1-py3-none-any.whl.

File metadata

  • Download URL: resultify-1.0.1-py3-none-any.whl
  • Upload date:
  • Size: 4.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.6.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.8.10

File hashes

Hashes for resultify-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 9c32f0dd8671a8098e42b81b88979959fe2c1ee5ec09e6359c90ed72e82848d9
MD5 04eb9a4bf3526d4b0daa1c43b0a53a7f
BLAKE2b-256 12d6ab321186fb85951cc54b88ef9309982f4557da072be2d427df1752464b21

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page