Skip to main content

The classic ``compose``, with all the Pythonic features.

Project description

The classic compose, with all the Pythonic features.

This compose follows the lead of functools.partial and returns callable compose objects which:

  • have a regular and unambiguous repr,

  • retain correct signature introspection,

  • allow introspection of the composed callables,

  • can be type-checked,

  • can be weakly referenced,

  • can have attributes,

  • will merge when nested, and

  • can be pickled (if all composed callables can be pickled).

This compose also fails fast with a TypeError if any argument is not callable, or when called with no arguments.

This module also provides an acompose which can compose both regular and async functions.

Versioning

This library’s version numbers follow the SemVer 2.0.0 specification.

Installation

pip install compose

Usage

Import compose:

from compose import compose

All the usual function composition you know and love:

>>> def double(x):
...     return x * 2
...
>>> def increment(x):
...     return x + 1
...
>>> double_then_increment = compose(increment, double)
>>> double_then_increment(1)
3

Of course any number of functions can be composed:

>>> def double(x):
...     return x * 2
...
>>> times_eight = compose(douple, double, double)
>>> times_16 = compose(douple, double, double, double)

We still get the correct signature introspection:

>>> def f(a, b, c=0, **kwargs):
...     pass
...
>>> def g(x):
...     pass
...
>>> g_of_f = compose(g, f)
>>> import inspect
>>> inspect.signature(g_of_f)
<Signature (a, b, c=0, **kwargs)>

And we can inspect all the composed callables:

>>> g_of_f.functions  # in order of execution:
(<function f at 0x4048e6f0>, <function g at 0x405228e8>)

When programmatically inspecting arbitrary callables, we can check if we are looking at a compose instance:

>>> isinstance(g_of_f, compose)
True

We can do all of the above with async functions mixed in by using acompose instead of compose:

from compose import acompose

Recipes

  • If you want composing zero functions to be the identity function:

    def identity(x):
        return x
    
    icompose = partial(compose, identity)
  • To compose arguments in reverse order:

    def rcompose(*functions):
        return compose(*reversed(functions))
  • When you need a regular function instead of a callable class instance (for example, to use compose as a method):

    def fcompose(*functions):
        composed = compose(*functions)
        return lambda *args, **kwargs: composed(*args, **kwargs)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

compose-1.2.5.tar.gz (4.7 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

compose-1.2.5-py38-none-any.whl (4.1 kB view details)

Uploaded Python 3.8

compose-1.2.5-py35-none-any.whl (4.1 kB view details)

Uploaded Python 3.5

compose-1.2.5-py2.py30-none-any.whl (3.9 kB view details)

Uploaded Python 2Python 3.0

File details

Details for the file compose-1.2.5.tar.gz.

File metadata

  • Download URL: compose-1.2.5.tar.gz
  • Upload date:
  • Size: 4.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.3.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.0 CPython/3.9.6

File hashes

Hashes for compose-1.2.5.tar.gz
Algorithm Hash digest
SHA256 92d109108f53ead1898d822b40d53eec3ef4c0bf8726cb938f082280e9d7cc35
MD5 8bcead7e624f19452f87dc35a976d2ab
BLAKE2b-256 125b4e1963753ca302407efef35d30a1ce188a18739a7aec4090348e08a0db93

See more details on using hashes here.

File details

Details for the file compose-1.2.5-py38-none-any.whl.

File metadata

  • Download URL: compose-1.2.5-py38-none-any.whl
  • Upload date:
  • Size: 4.1 kB
  • Tags: Python 3.8
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.3.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.0 CPython/3.9.6

File hashes

Hashes for compose-1.2.5-py38-none-any.whl
Algorithm Hash digest
SHA256 97b7cc988a7940b272ad81baa3b043faa0b5c4b59973c3fee285a7ea175ff2aa
MD5 233581a178ac160dd5e025250366e9a1
BLAKE2b-256 5f7e3e5dd9c1debab194b95ec48ff506a96e7169695d6f0dfedb1a3a241bb7f1

See more details on using hashes here.

File details

Details for the file compose-1.2.5-py35-none-any.whl.

File metadata

  • Download URL: compose-1.2.5-py35-none-any.whl
  • Upload date:
  • Size: 4.1 kB
  • Tags: Python 3.5
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.3.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.0 CPython/3.9.6

File hashes

Hashes for compose-1.2.5-py35-none-any.whl
Algorithm Hash digest
SHA256 831521d3da26b2e08911a9d51c4da8bb547bdac3714f7b6361ddcba3f9fcae1b
MD5 3bd225c179eb98e1acb05c7b6e46b8fb
BLAKE2b-256 fb3878c53f1771889f8fe0165d0532b789cf8c249c691537dcbb6d48a7a378b2

See more details on using hashes here.

File details

Details for the file compose-1.2.5-py2.py30-none-any.whl.

File metadata

  • Download URL: compose-1.2.5-py2.py30-none-any.whl
  • Upload date:
  • Size: 3.9 kB
  • Tags: Python 2, Python 3.0
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.3.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.0 CPython/3.9.6

File hashes

Hashes for compose-1.2.5-py2.py30-none-any.whl
Algorithm Hash digest
SHA256 6915be122d6a543b8ecd1fa80a2e9d96d9da655f5e04bbfd4a9bdfb04176d7ed
MD5 2b24232f24229e5c6e51bdf1ae82d562
BLAKE2b-256 25ecfd540b7844557a6ccb53c3d1799b92b35bb6847526c78a817bd023be7f67

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page