optional.py 2.0.0

Creator: railscoder56

Last updated:

Add to Cart

Description:

optional.py 2.0.0

Optional.py











An Implementation of the Optional Object for Python
Why
There is a difference between None as Empty and None as the result for an
Error. A common bad practice is to return None to indicate the absence of
something. Doing this introduces ambiguity into you code.
For example:
thing = stuff.getSomeThing().getAnotherThing()

What will happen if the result from getSomeThing returns None? We will get an
AttributeError: 'NoneType' object has no attribute 'getAnotherThing'.
What can you do to prevent these kinds of exceptions? You can write defensively:
something = stuff.getSomeThing()
if something is not None:
thing = something.getAnotherThing()

However, if we add to our chain, you can imagine how the nesting of defensive
checks adds up quickly. These defensive checks obfuscate our actual business
logic, decreasing readability. Furthermore, defensive checking is an error prone
process, because it is easy to forget to check a required condition.
So we present you with an Optional object as an alternative.
Install
Compatible with Python 3.10 and up!
pip install optional.py

Usage


You can import it using:
from optional import Nothing, Option, Optional, Something



You can set it to empty:
instead of: :scream_cat:
return None

you can do: :smile_cat:
return Optional.empty()

or
return Optional.of()



You can set it to have content:
instead of: :scream_cat:
return "thing"

you can do: :smile_cat:
return Optional.of("thing")



You can check if its present:
instead of: :scream_cat:
if thing is not None:

you can do: :smile_cat:
thing = some_func_returning_an_optional()
if thing:



You can check if its empty:
instead of: :scream_cat:
if thing is None:

you can do: :smile_cat:
thing = some_func_returning_an_optional()
if not thing:



You can match against the result and destructure the value:
instead of: :scream_cat:
print(thing)

you can do: :smirk_cat:
match some_func_returning_an_optional():
case Something(thing):
print(thing)



You can match against an empty optional, but can't destructure the value:
instead of: :crying_cat_face:
if thing is None:
print(None) # very odd

you can do: :smirk_cat:
match some_func_returning_an_optional()
case Nothing():
print("We didn't get a thing!")



You can compare two optionals: :smile_cat:
Optional.empty() == Optional.empty() # True
Optional.of("thing") == Optional.of("thing") # True
Optional.of("thing") == Optional.empty() # False
Optional.of("thing") == Optional.of("PANTS") # False



Tests
There is complete test coverage and they pass in all Python versions 3.10 and up.
Running Unit Tests
First, install poetry using the instructions located here.
Then, install the requirements using:
poetry install

You can run the tests (with coverage) using:
poetry run pytest

License

For personal and professional use. You cannot resell or redistribute these repositories in their original state.

Customer Reviews

There are no reviews.