跳转到主要内容

纯效果用于Python

项目描述

Effect

https://travis-ci.org/python-effect/effect.svg?branch=master https://img.shields.io/pypi/v/effect.svg

Effect 是一个库,帮助您通过隔离代码中的效果(即IO或状态操作)来编写纯函数式代码。文档可在 https://effect.readthedocs.org/ 找到,其 PyPI 页面为 https://pypi.python.org/pypi/effect

支持 3.6 及以上版本。

您可以通过运行 pip install effect 来安装它。

https://radix.github.io/effect/sigh-defects.png

这是什么?

Effect 允许您隔离您的IO和状态操作代码。

这样做的好处有很多:首先,您的大多数代码可以成为纯函数式代码,这有助于测试并能够推理行为。此外,因为它将效果的定义与效果的执行分离,还有两个额外的好处:测试变得更加容易,并且可以轻松提供效果的替代实现。

Effect 在某种程度上类似于在各类类型化函数式编程语言中实现的“代数效果”。它也类似于 Twisted 的 Deferred 对象。

示例

使用 Effects 的一个非常简单的示例

from effect import sync_perform, sync_performer, Effect, TypeDispatcher

class ReadLine(object):
    def __init__(self, prompt):
        self.prompt = prompt

def get_user_name():
    return Effect(ReadLine("Enter a candy> "))

@sync_performer
def perform_read_line(dispatcher, readline):
    return raw_input(readline.prompt)

def main():
    effect = get_user_name()
    effect = effect.on(
        success=lambda result: print("I like {} too!".format(result)),
        error=lambda e: print("sorry, there was an error. {}".format(e)))

    dispatcher = TypeDispatcher({ReadLine: perform_read_line})
    sync_perform(dispatcher, effect)

if __name__ == '__main__':
    main()

Effect 接收我们所说的 intent(意图),这是任何对象。在 sync_performdispatcher 参数中必须为您的意图提供一个 performer 函数。

这有几个优点。首先,您的 get_user_name 的单元测试变得更加简单。您不需要模拟或参数化 raw_input 函数 - 您只需调用 get_user_name 并断言它返回一个带有正确 'prompt' 值的 ReadLine 对象。

其次,您可以通过多种方式实现 ReadLine - 您可以覆盖意图的执行方式来执行任何您想要的操作。

有关如何实现实际效果执行代码以及其他细节的更多信息,请参阅文档。在effect-examples仓库中还有一个与用户交互和使用HTTP客户端与GitHub API通信的完整示例。

视频

关于Effect已经有一些演讲了。

感谢

感谢Rackspace允许我参与这个项目,并拥有一个优秀的开源贡献政策

作者

Effect最初由Christopher Armstrong编写,但现在以下人员也做出了贡献

IRC

在irc.freenode.net上有#python-effect的IRC频道。

参见

有关将Effect与Twisted的Deferreds集成的信息,请参阅txEffect包(pypigithub)。

在过去几年中,Python中用于函数式编程的库生态系统爆炸式增长。以下是我推荐的一些库

  • pyrsistent - Python中的持久(优化不变)数据结构

  • toolz - 一个纯FP函数的通用库

  • fn.py - 受Scala启发的工具集,包括奇特的lambda语法、选项类型和monads

许可证

Effect遵循MIT许可证

版权(C)2014 Christopher Armstrong

特此授予任何人免费获得此软件及其相关文档文件(“软件”)副本的权利,以无限制地处理软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本,并允许向软件提供者提供软件的人这样做,前提是遵守以下条件

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、适用于特定目的和不侵犯版权。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论此类责任是基于合同、侵权或其他方式,以及与软件或软件的使用或其他交易有关。

项目详情


下载文件

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

源代码分发

effect-1.1.0.tar.gz (33.7 kB 查看散列值)

上传时间 源代码

构建分发

effect-1.1.0-py2.py3-none-any.whl (41.2 kB 查看散列值)

上传时间 Python 2 Python 3

由以下支持