Skip to main content

No project description provided

Project description

rust-result

More radical approach to Rust's std::result in Python.

Motivation

I do not want exceptions in my code. Rust has this figured out quite neatly by essentially revolving around two pathways for errors: A possible error condition is either one that has no prospect of being handled -- then the program should terminate -- or it is one that could be handled -- then it has to be handled or explicitly ignored.

This concept is replicated here by using AssertionError to emulate Rust's panic!, mapping all unhandled exceptions to AssertionError and providing a Rust-like result type to signal error conditions that do not need to terminate the program.

Documentation

from rust_result import Ok, Err, returns_result

@returns_result()
def read_file():
    with open('/this/path/is/invalid') as f:
        return Ok(f.read())

result = func()

This will raise an AssertionError due to an unhandled exception.

But if you specify the exceptions you expect, you can handle the error:

@returns_result(FileNotFoundError)
def read_file():
    with open('/this/path/is/invalid') as f:
        return Ok(f.read())

result = func()
if result.is_ok():
    print(f'File content: {result.unwrap()}')
else:
    print(f'Error: {result.unwrap_err()}')

Or -- if you are feeling fancy -- you can do pattern matching:

@returns_result(FileNotFoundError)
def read_file():
    with open('/this/path/is/invalid') as f:
        return f.read()

result = read_file()
match result:
    case Ok(v):
        print(f'File content: {v}')
    case Err(e):
        print(f'Error: {e}')

And even fancier:

data = [
    { 'foo': 'value-1' },
    { 'bar': 'value-2' }
]

@returns_result(IndexError, KeyError)
def retrieve_record_entry_backend(index, key):
    return Ok(data[index][key])

def retrieve_record_entry(index, key):
    match retrieve_record_entry_backend(index, key):
        case Ok(v):
            print(f'Retrieved: {v}')
        case Err(IndexError()):
            print(f'No such record: {index}')
        case Err(KeyError()):
            print(f'No entry `{key}` in record {index}')

retrieve_record_entry(2, 'foo')    # No such record: 2
retrieve_record_entry(1, 'foo')    # No entry `foo` in record 1
retrieve_record_entry(1, 'bar')    # Retrieved: value-2

Similar Projects

For a less extreme approach on Rust's result type, see:

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

rust_result-0.2.1.tar.gz (3.2 kB view details)

Uploaded Source

Built Distribution

rust_result-0.2.1-py3-none-any.whl (3.9 kB view details)

Uploaded Python 3

File details

Details for the file rust_result-0.2.1.tar.gz.

File metadata

  • Download URL: rust_result-0.2.1.tar.gz
  • Upload date:
  • Size: 3.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.3 CPython/3.10.12 Linux/5.15.0-113-generic

File hashes

Hashes for rust_result-0.2.1.tar.gz
Algorithm Hash digest
SHA256 db91371538ae870a4d552ce59e6c3deba9110094ee8bcd6a46dce44464d1c11b
MD5 091811736def8a96778db48ce81a8695
BLAKE2b-256 2f552593c81761ba46186bfa5828031a5e47eeb59a17492825f7ec10bc8ead0a

See more details on using hashes here.

File details

Details for the file rust_result-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: rust_result-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 3.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.3 CPython/3.10.12 Linux/5.15.0-113-generic

File hashes

Hashes for rust_result-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 0d428de9f54c0fe512631e150201b5165bf08f9128ca35c5de2c3ac96436c422
MD5 d92fa215162a35a2202e83180cd21e10
BLAKE2b-256 1430af630ee6f06c34b6b40b2966173dca8c011b09449e8adefe9c97ce2340a5

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