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.3.tar.gz (4.6 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.3-py38-none-any.whl (4.1 kB view details)

Uploaded Python 3.8

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

Uploaded Python 3.5

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

Uploaded Python 2Python 3.0

File details

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

File metadata

  • Download URL: compose-1.2.3.tar.gz
  • Upload date:
  • Size: 4.6 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.3.tar.gz
Algorithm Hash digest
SHA256 b3e0922b1e0475c4500f51994f4cee1950aa7d4217e59b2f972789e88f598187
MD5 feb555eedfbb43e004dbcbaf7f69cb41
BLAKE2b-256 5ce2bfa9a6666346fbdf3884ba61c0c5c96f5a319797584d52bf53d817a2f5e7

See more details on using hashes here.

File details

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

File metadata

  • Download URL: compose-1.2.3-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.3-py38-none-any.whl
Algorithm Hash digest
SHA256 b23025fd64ab536c52cc435b83540d67355dd538679f15f382829c40b750bc1c
MD5 73ccfb4d263eb5d7b5330b9ae75a7b10
BLAKE2b-256 a5b3273c56b9fbf4716d14edd7f48990e33e648f8890a059d0dd9b20ac36928e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: compose-1.2.3-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.3-py35-none-any.whl
Algorithm Hash digest
SHA256 3cb6241c87637a9c7d0d52e1a76ff2a09fd47472fa007275f9a98beba8d1f7ce
MD5 234d9bd5f4c772b7297fbbe231e2826f
BLAKE2b-256 b1e08495bef19be023b83d2af1476dbb3047876864f622c8aa0c639edb6ffdc3

See more details on using hashes here.

File details

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

File metadata

  • Download URL: compose-1.2.3-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.3-py2.py30-none-any.whl
Algorithm Hash digest
SHA256 24a0ece66f43d8b4dedd96eaa4ef92183fd5867472ed00a8093a90fdf4a7b283
MD5 62ebf1c9eedb44de073fdf415e6c79dc
BLAKE2b-256 d69fc978831877816f20aefb0efcb29c12105ba89a346597939f648e9379bd51

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