python的纯效果
effect的Python项目详细描述
效果
effect是一个库,通过隔离 代码中的效果(即IO或状态操作)。文件是 可在https://effect.readthedocs.org/找到,其pypi页面是 https://pypi.python.org/pypi/effect。
python 2.7、3.4和3.5以及pypy。
您可以通过运行pip install effect来安装它。
这是什么?
effect允许隔离io和状态操作代码。
这样做的好处很多:首先,大部分代码可以 纯粹的功能性,使测试更容易,并且能够对 行为。另外,因为它将效果的规范与 性能的效果,还有两个好处:测试变得更容易 不过,提供其他效果实现也很容易。
效果有点类似于“代数效果”,在 类型化函数式编程语言。它和Twisted的也有相似之处 延迟对象。
示例
一个使用效果的快速示例:
from__future__importprint_functionfromeffectimportsync_perform,sync_performer,Effect,TypeDispatcherclassReadLine(object):def__init__(self,prompt):self.prompt=promptdefget_user_name():returnEffect(ReadLine("Enter a candy> "))@sync_performerdefperform_read_line(dispatcher,readline):returnraw_input(readline.prompt)defmain():effect=get_user_name()effect=effect.on(success=lambdaresult:print("I like {} too!".format(result)),error=lambdae:print("sorry, there was an error. {}".format(e)))dispatcher=TypeDispatcher({ReadLine:perform_read_line})sync_perform(dispatcher,effect)if__name__=='__main__':main()
Effect接受我们所称的intent,它是任何对象。这个 dispatcher参数到sync_perform必须有一个performer函数 为了你的意图。
这有很多优点。首先,对^{tt7}进行单元测试$ 变得更简单。您不需要模拟或参数化raw_input 函数-只需调用get_user_name,并断言它返回一个readline 具有正确“prompt”值的对象。
第二,你可以用很多不同的方法实现readline 可以重写执行意图的方式,以执行您想要的任何操作。
有关如何实现实际效果执行代码的更多信息, 以及其他详细信息,请参见documentation。还有一个完整的例子 与用户交互并使用http客户端与github对话 effect-examples存储库中的api。
视频
已经就效果进行了一些会谈。
- Side Effects are a Public API作者:克里斯·阿姆斯特朗(Chris Armstrong),Strange Loop(2015-09-26)
- Functionalish Programming in Python with Effect作者:罗伯特·柯林斯(Robert Collins)在Kiwi PyCon(2015-09-05)
谢谢
感谢Rackspace允许我参与这个项目,并且 优秀的open source employee contribution policy
IRC
irc.freenode.net上有一个#python-effectirc频道。
另请参见
要将效果与twisted的延迟进行集成,请参见txEffect包 (pypi,github)。
在过去的几年里,图书馆的生态系统 用python编程已经爆炸了。以下是我推荐的一些库:
- pyrsistent-python中的持久(优化的不可变)数据结构
- toolz-纯fp函数的通用库
- fn.py-一组受scala启发的工具,包括奇怪的lambda语法、选项类型和monad
许可证
效果是根据麻省理工学院的许可证获得的:
版权所有(c)2014 Christopher Armstrong
兹免费准许任何人取得 本软件和相关文档文件(“软件”),用于处理 不受限制的软件,包括但不限于 使用、复制、修改、合并、发布、分发、再授权和/或出售 软件,并允许向其提供软件的人员这样做, 必须满足以下条件:
上述版权公告及本许可公告须包括在 软件的拷贝或大部分。
本软件按“原样”提供,无任何形式的保证,明示或 隐含的,包括NG但不限于适销性、适用性保证 为了特定的目的和不受侵犯。在任何情况下,作者或 版权持有人应对任何索赔、损害或其他责任负责,无论 在诉讼或合同中,侵权行为或其他方式,由 与软件的连接或软件的使用或其他交易