Python的Promises/A+实现
项目描述
Promise
这是Python中Promises的实现。它是Promises/A+的超集,旨在编写可读性高、性能良好的代码,并提供在Python中使用promises所必需的扩展。
它完全兼容于Promises/A+规范
安装
$ 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 函数接收两个参数
resolve 应该使用单个参数调用。如果它使用非Promise值调用,则Promise会使用该值实现。如果它使用Promise(A)调用,则返回的Promise会采用该新Promise(A)的状态。
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_fulfill 或 did_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的启发。