跳转到主要内容

Python的Promises/A+实现

项目描述

Promise

这是Python中Promises的实现。它是Promises/A+的超集,旨在编写可读性高、性能良好的代码,并提供在Python中使用promises所必需的扩展。

它完全兼容于Promises/A+规范

travis pypi coveralls

安装

$ pip install promise

用法

下面的示例展示了如何加载promise库。然后演示了从头开始创建promise。您只需调用Promise(fn)。关于此方法返回内容的完整规范可在Promises/A+中找到。

from promise import Promise

promise = Promise(
    lambda resolve, reject: resolve('RESOLVED!')
)

API

在所有示例之前,您需要

from promise import Promise

Promise(resolver)

这会创建并返回一个新的Promise。 resolver 必须是一个函数。resolver 函数接收两个参数

  1. resolve 应该使用单个参数调用。如果它使用非Promise值调用,则Promise会使用该值实现。如果它使用Promise(A)调用,则返回的Promise会采用该新Promise(A)的状态。

  2. reject 应该使用单个参数调用。返回的Promise将使用该参数拒绝。

类方法

这些方法通过调用 Promise.methodName 来调用。

Promise.resolve(value)

将值和外部Promise转换为Promises/A+ Promise。如果您传递一个值,则它返回一个对该值的Promise。如果您传递一个接近Promise的东西(例如jQuery尝试的Promise),则返回一个Promise,该Promise采用value的状态(拒绝或实现)。

Promise.reject(value)

返回一个带有给定值的拒绝Promise。

Promise.all(list)

返回一个针对列表的Promise。如果它使用单个参数调用,则它返回一个针对列表副本的Promise,任何Promise都替换为其实现的值。例如。

p = Promise.all([Promise.resolve('a'), 'b', Promise.resolve('c')]) \
       .then(lambda res: res == ['a', 'b', 'c'])

assert p.get() is True
Promise.cast(obj)

此函数尝试将 obj 包装成 Promise。如果可能,支持Python Future,在解决时调用 promise.done。具有与 Promise.resolve(obj) 相同的效果。

Promise.for_dict(d)

一个特殊函数,它接受一个Promise字典并将其转换为值字典的Promise。换句话说,它将值的Promise字典转换为值字典的Promise。

Promise.is_thenable(obj)

此函数检查 obj 是否是 Promise 或可转换为 cast

Promise.promisify(func)

此函数将调用 func 的结果包装在一个 Promise 实例中。

实例方法

这些方法通过调用 myPromise.methodName 在Promise实例上调用。

promise.then(did_fulfill, did_reject)

此方法遵循 Promises/A+ 规范。它解释得非常清楚,因此我建议您阅读它。

将调用 did_fulfilldid_reject,并且它们不会被调用多次。它们将传递单个参数,并且始终以异步方式(在事件循环的下一次轮换中)调用。

如果Promise实现,则调用 did_fulfill。如果Promise拒绝,则调用 did_reject

调用 .then 还返回一个Promise。如果调用的处理程序返回一个Promise,则 .then 返回的Promise采用该返回Promise的状态。如果调用的处理程序返回一个不是Promise的值,则 .then 返回的Promise将使用该值实现。如果调用的处理程序抛出异常,则 .then 返回的Promise将使用该异常拒绝。

promise.catch(did_reject)

这是 promise.then(None, did_reject) 的简化形式,以反映同步代码中的 catch

promise.done(did_fulfill, did_reject)

.then 相同的语义,但不会返回一个Promise,任何异常都会重新抛出,以便可以记录(在非浏览器环境中崩溃应用程序)。

贡献

克隆此仓库后,确保通过运行以下命令安装依赖项:

pip install -e ".[test]"

开发完成后,可以通过运行以下命令评估完整的测试套件:

py.test tests --cov=promise --benchmark-skip # Use -v -s for verbose mode

您还可以使用以下命令运行基准测试:

py.test tests --benchmark-only

静态类型检查

Python类型注解对于确保我们按预期使用库非常有用。

您可以使用mypy静态类型检查器

pip install mypy
mypy promise  --ignore-missing-imports

pyre

pip install pyre-check
pyre --source-directory promise check

注意

此包深受aplus的启发。

许可证

MIT许可证

项目详情


下载文件

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

源代码分发

promise-2.3.tar.gz (19.5 kB 查看哈希值)

上传时间 源代码

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面