Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/ekampf/pymaybe
A Python implementation of the Maybe pattern
https://github.com/ekampf/pymaybe
Last synced: 2 days ago
JSON representation
A Python implementation of the Maybe pattern
- Host: GitHub
- URL: https://github.com/ekampf/pymaybe
- Owner: ekampf
- License: bsd-3-clause
- Created: 2015-07-13T06:09:07.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2022-12-26T19:44:22.000Z (about 2 years ago)
- Last Synced: 2024-12-28T14:11:29.498Z (9 days ago)
- Language: Python
- Size: 53.7 KB
- Stars: 208
- Watchers: 7
- Forks: 6
- Open Issues: 7
-
Metadata Files:
- Readme: README.rst
- Changelog: HISTORY.rst
- Contributing: CONTRIBUTING.rst
- License: LICENSE
Awesome Lists containing this project
README
===============================
PyMaybe
===============================.. image:: https://travis-ci.org/ekampf/pymaybe.svg?branch=master
:target: https://travis-ci.org/ekampf/pymaybe.. image:: https://coveralls.io/repos/ekampf/pymaybe/badge.svg?branch=master&service=github
:target: https://coveralls.io/github/ekampf/pymaybe?branch=master.. image:: https://img.shields.io/pypi/v/pymaybe.svg
:target: https://pypi.python.org/pypi/pymaybe.. image:: https://img.shields.io/pypi/dm/pymaybe.svg
:target: https://pypi.python.org/pypi/pymaybeA Python implementation of the Maybe pattern.
Installation
------------.. code::
pip install pymaybe
Getting Started
---------------.. code::
from pymaybe import maybe
first_name = maybe(deep_hash)['account']['user_profile']['first_name'].or_else("")Documentation
-------------
Maybe monad is a programming pattern that allows to treat None values that same way as non-none values.
This is done by wrapping the value, which may or may not be None to, a wrapper class.The implementation includes two classes: *Maybe* and *Something*.
*Something* represents a value while *Nothing* represents a None value.
There's also a method *maybe* which wraps a regular value and and returns *Something* or *Nothing* instance... code::
>>> maybe("I'm a value")
"I'm a value">>> maybe(None);
NoneBoth *Something* and *Nothing* implement 4 methods allowing you to test their real value: *is_some*, *is_none*, *get* and *or_else*
.. code::
>>> maybe("I'm a value").is_some()
True>>> maybe("I'm a value").is_none()
False>>> maybe(None).is_some()
False>>> maybe(None).is_none()
True>>> maybe("I'm a value").get()
"I'm a value">>> maybe("I'm a value").or_else(lambda: "No value")
"I'm a value">>> maybe(None).get()
Traceback (most recent call last):
...
Exception: No such element>>> maybe(None).or_else(lambda: "value")
'value'>>> maybe(None).or_else("value")
'value'In addition, *Something* and *Nothing* implement the Python magic methods allowing you to treat them as dictionaries:
.. code::
>>> nested_dict = maybe(nested_dict)
>>> nested_dict['store']['name']
'MyStore'>>> nested_dict['store']['address']
None>>> nested_dict['store']['address']['street'].or_else('No Address Specified')
'No Address Specified'All other method calls on *Something* are forwarded to its real *value*:
.. code::
>>> maybe('VALUE').lower()
'value'>>> maybe(None).invalid().method().or_else('unknwon')
'unknwon'Examples & Use Cases
--------------------The Maybe pattern helps you avoid nasty try..except blocks.
Consider the following code:.. code::
try:
url = rss.load_feeds()[0].url.domain
except (TypeError, IndexError, KeyError, AttributeError):
url = "planetpython.org"With Maybe you could simply do:
.. code::
url = maybe(rss).load_feeds()[0]['url'].domain.or_else("planetpython.org")
Getting the current logged in user's name.
Without maybe:.. code::
def get_user_zipcode():
address = getattr(request.user, 'address', None)
if address:
return getattr(address, 'zipcode', '')return ''
With maybe:
.. code::
def get_user_zipcode():
return maybe(request.user).address.zipcode.or_else('')Further Reading
---------------* `Option (Scala) `_
* `Maybe (Java) `_
* `Maybe pattern (Python recipe) `_
* `Data.Maybe (Haskell) `_
* `Maybe (Ruby) `_Copyright and License
---------------------
Copyright 2015 - `Eran Kampf `_* Free software: BSD license
* Documentation: https://pymaybe.readthedocs.org.
* Code is hosted on `GitHub `_