Smonad-功能库
smonad的Python项目详细描述
简介
什么?
python中的monad,以及一些有用的函数。
这个包裹是Philip Xu的优质叉子。 Philip的包经过了修改,使之更适合Python开发人员。它 从优秀的lambda图书馆获得一些灵感 对于java和scala的Try monad
python开发人员可能会发现try monad特别有用,因为它允许您处理错误 作为价值观。
为什么?
python没有处理多个 批量操作。此外,这个图书馆的作者发现过度依赖 on类会导致代码的可组合性降低。
这个库借鉴了haskell和其他函数式编程的一些思想。 更好地处理上述用例的语言。而这个图书馆 以“monad”的名字命名,你不需要知道 单子的概念以便使用这个库。
将错误视为值
python没有将错误作为值处理的内置约定 除了尝试/除外。
smonad引入了包装failed或 容器类中的成功结果。
实用程序方法attempt执行可调用并包装引发的异常 在失败的课堂上。如果未引发异常,则返回成功
>>> from smonad.actions import attempt >>> result = attempt(lambda: 1 / 0) >>> print result Failure(ZeroDivisionError('integer division or modulo by zero',)) >>> exc = result.value >>> exc ZeroDivisionError('integer division or modulo by zero',) >>> # the following would fail as it does not catch the correct exception >>> # result = attempt(lambda: 1 / 0, exception=ValueError) >>> result = attempt(lambda: 1 / 1) >>> print result Success(1) >>> result.value 1
您可以在自己的代码中实例化失败或成功,以指示 计算是否成功。
下面是创建使用失败/成功的aws实例的示例脚本 将故障传播到尽可能高的级别。
from collections import namedtuple from smonad.types.ftry import Success, Failure from smonad.utils import failed import sys import os CloudInstance = namedtuple('CloudInstance', ['name', 'provider', 'instance_type']) jenkins = CloudInstance(name='jenkins', provider='aws', instance_type='m3.medium') git = CloudInstance(name='git', provider='aws', instance_type='m3.xlarge') vault = CloudInstance(name='vault', provider='aws', instance_type='m3.xlarge') class TryAgainLaterError(Exception): pass def aws_create_instance(instance): if instance.name == 'jenkins': raise TryAgainLaterError("Can't create jenkins server right now") return instance def create_cloud_instance(instance): try: created_instance = aws_create_instance(instance) return Success(created_instance) except TryAgainLaterError as e: return Failure(instance) def make_my_servers(): server_results = [] for server in [jenkins, git, vault]: server_results.append(create_cloud_instance(server)) # if there are any errors, let's retry once more failed_servers = filter(lambda r: failed(r), server_results) retry_results = [] for exc, instance in failed_servers: retry_results.append(aws_create_instance(instance)) if any([failed(i) for i in retry_results]): failed_servers = ",".join([i.value.name for i in retry_results if failed(i)]) return Failure("Unable to create servers: %s" % failed_servers) return Success("Successfully created all servers") if __name__ == "__main__": result = make_my_servers() if failed(result): sys.stderr.write("Error: %s\n" % result.value) os.sys.exit(1) else: print result.value
我们可以利用 在Try的recover方法中。recover应用恢复功能 失败的例子。它返回成功(v)不变。
def make_my_servers(): server_results = [] for server in [jenkins, git, vault]: server_results.append(create_cloud_instance(server)) # The recover only applies ``create_cloud_instance`` to Failures, it returns the Success value otherwise server_results = map(lambda s: s.recover(create_cloud_instance), server_results) if any([failed(s) for s in server_results]): failed_servers = ",".join([i.value.name for i in server_results if failed(i)]) return Failure("Unable to create servers: %s" % failed_servers) return Success("Successfully created all servers")
组成函数
>>> from smonad.decorators import maybe >>> parse_int = maybe(int) >>> parse_int(42) Just(42) >>> parse_int('42') Just(42) >>> parse_int('42.2') Nothing >>> parse_float = maybe(float) >>> parse_float('42.2') Just(42.2) >>> from smonad.actions import tryout >>> parse_number = tryout(parse_int, parse_float) >>> tokens = [2, '0', '4', 'eight', '10.0'] >>> [parse_number(token) for token in tokens] [Just(2), Just(0), Just(4), Nothing, Just(10.0)] >>> @maybe ... def reciprocal(n): ... return 1. / n >>> reciprocal(2) Just(0.5) >>> reciprocal(0) Nothing >>> process = parse_number >> reciprocal >>> process('4') Just(0.25) >>> process('0') Nothing >>> [process(token) for token in tokens] [Just(0.5), Nothing, Just(0.25), Nothing, Just(0.1)] >>> [parse_number(token) >> reciprocal for token in tokens] [Just(0.5), Nothing, Just(0.25), Nothing, Just(0.1)] >>> [parse_number(token) >> reciprocal >> reciprocal for token in tokens] [Just(2.0), Nothing, Just(4.0), Nothing, Just(10.0)]
要求
- cpython=2.7
安装
从pypi安装:
pip install smonad
从源安装,下载源包,解压缩,然后cd到源目录,运行:
make install
许可证
bsd new,请参阅许可证以了解详细信息。