Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

Promise

This is a implementation of Promises in Python. It is a super set of Promises/A+ designed to have readable, performant code and to provide just the extensions that are absolutely necessary for using promises in Python.

Its fully compatible with the Promises/A+ spec

travis pypi coveralls

Installation

$ pip install promise

Usage

The example below shows how you can load the promise library. It then demonstrates creating a promise from scratch. You simply call Promise(fn). There is a complete specification for what is returned by this method in Promises/A+.

from promise import Promise

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

API

Before all examples, you will need:

from promise import Promise

Promise(resolver)

This creates and returns a new promise. resolver must be a function. The resolver function is passed two arguments:

  1. resolve should be called with a single argument. If it is called with a non-promise value then the promise is fulfilled with that value. If it is called with a promise (A) then the returned promise takes on the state of that new promise (A).

  2. reject should be called with a single argument. The returned promise will be rejected with that argument.

Class Methods

These methods are invoked by calling Promise.methodName.

Promise.resolve(value)

Converts values and foreign promises into Promises/A+ promises. If you pass it a value then it returns a Promise for that value. If you pass it something that is close to a promise (such as a jQuery attempt at a promise) it returns a Promise that takes on the state of value (rejected or fulfilled).

Promise.reject(value)

Returns a rejected promise with the given value.

Promise.all(list)

Returns a promise for a list. If it is called with a single argument then this returns a promise for a copy of that list with any promises replaced by their fulfilled values. e.g.

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)

This function wraps the obj act as a Promise if possible. Python Futures are supported, with a callback to promise.done when resolved. Have the same effects as Promise.resolve(obj).

Promise.for_dict(d)

A special function that takes a dictionary of promises and turns them into a promise for a dictionary of values. In other words, this turns an dictionary of promises for values into a promise for a dictionary of values.

Promise.is_thenable(obj)

This function checks if the obj is a Promise, or could be promisifyed.

Instance Methods

These methods are invoked on a promise instance by calling myPromise.methodName

promise.then(did_fulfill, did_reject)

This method follows the Promises/A+ spec. It explains things very clearly so I recommend you read it.

Either did_fulfill or did_reject will be called and they will not be called more than once. They will be passed a single argument and will always be called asynchronously (in the next turn of the event loop).

If the promise is fulfilled then did_fulfill is called. If the promise is rejected then did_reject is called.

The call to .then also returns a promise. If the handler that is called returns a promise, the promise returned by .then takes on the state of that returned promise. If the handler that is called returns a value that is not a promise, the promise returned by .then will be fulfilled with that value. If the handler that is called throws an exception then the promise returned by .then is rejected with that exception.

promise.catch(did_reject)

Sugar for promise.then(None, did_reject), to mirror catch in synchronous code.

promise.done(did_fulfill, did_reject)

The same semantics as .then except that it does not return a promise and any exceptions are re-thrown so that they can be logged (crashing the application in non-browser environments)

Contributing

After cloning this repo, ensure dependencies are installed by running:

pip install -e ".[test]"

After developing, the full test suite can be evaluated by running:

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

You can also run the benchmarks with:

py.test tests --benchmark-only

Notes

This package is heavily insipired in aplus.

License

MIT License

Metadata

Release files for promise 2.0.dev20170314074715

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for promise 2.0.dev20170314074715
File Size Uploaded Provenance Actions
promise-2.0.dev20170314074715.tar.gz 18.1 kB Without provenance Details for promise-2.0.dev20170314074715.tar.gz

Release files / promise-2.0.dev20170314074715.tar.gz

Download URL promise-2.0.dev20170314074715.tar.gz
Size 18.1 kB
Tags Source
SHA-256 checksum
How to use checksums
b4895b5551eb760da1aa9883f90adf8aa2f1ec6dddb699a2d4408b31134263f4
BLAKE2b-256 checksum
How to use checksums
2644cdf55fa2ff79f4de83bac1bdf976398523640e968c4680c409818c80d810
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Security for promise 2.0.dev20170314074715

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page