跳转到主要内容

Python实现Maybe模式。

项目描述

https://travis-ci.org/ekampf/pymaybe.svg?branch=master https://coveralls.io/repos/ekampf/pymaybe/badge.svg?branch=master&service=github https://img.shields.io/pypi/v/pymaybe.svg

Python实现Maybe模式。

安装

pip install pymaybe

入门指南

from pymaybe import maybe
first_name = maybe(deep_hash)['account']['user_profile']['first_name'].or_else("<unknown>")

文档

Maybe monad是一种编程模式,允许将None值与非None值以相同的方式处理。这是通过将可能为None也可能不为None的值包装到一个包装类中实现的。

实现包括两个类:MaybeSomething。其中,Something 表示一个值,而 Nothing 表示一个None值。还有一个 maybe 方法,它包装一个常规值并返回 SomethingNothing 实例。

>>> maybe("I'm a value")
"I'm a value"

>>> maybe(None);
None

SomethingNothing 都实现了4个方法,允许您测试它们的实际值:is_someis_nonegetor_else

>>> 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'

此外,SomethingNothing 还实现了Python的魔法方法,允许您将它们作为字典处理

::
>>> 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'

Something 上进行的所有其他方法调用都转发到其实际 value

>>> maybe('VALUE').lower()
'value'

>>> maybe(None).invalid().method().or_else('unknwon')
'unknwon'

示例和用例

The Maybe pattern helps you avoid nasty try..except blocks. Consider the following code

::
try

url = rss.load_feeds()[0].url.domain

except (TypeError, IndexError, KeyError, AttributeError)

url = “planetpython.org”

With Maybe you could simply do

url = maybe(rss).load_feeds()[0]['url'].domain.or_else("planetpython.org")

获取当前登录用户的名字。没有 maybe

def get_user_zipcode():
    address = getattr(request.user, 'address', None)
    if address:
        return getattr(address, 'zipcode', '')

    return ''

使用 maybe

def get_user_zipcode():
    return maybe(request.user).address.zipcode.or_else('')

进一步阅读

历史

0.1.0 (2015-01-11)

  • 首次发布于PyPI。

项目详情


下载文件

下载适用于您平台文件的文件。如果您不确定该选择哪个,请了解有关安装包的更多信息。

源分布

pymaybe-0.1.6.tar.gz (16.7 kB 查看哈希值)

上传时间

构建分布

pymaybe-0.1.6-py2.py3-none-any.whl (7.8 kB 查看哈希值)

上传时间 Python 2 Python 3

支持者