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

Uploaded Python 3.8

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

Uploaded Python 3.5

compose-1.2.2-py2.py30-none-any.whl (4.0 kB view details)

Uploaded Python 2Python 3.0

File details

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

File metadata

  • Download URL: compose-1.2.2.tar.gz
  • Upload date:
  • Size: 3.5 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.2.tar.gz
Algorithm Hash digest
SHA256 5fa988bc5d9a25a3305f4990c46cdff3a0549499ca4197820fd41b3b3d82c1e1
MD5 308895bfcaded2b388c0c4ab1522cde3
BLAKE2b-256 666eac950b03b0ca4d38b796d0dd12ddf1e8b30e77687bce0f6c6525f6ea3f08

See more details on using hashes here.

File details

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

File metadata

  • Download URL: compose-1.2.2-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.2-py38-none-any.whl
Algorithm Hash digest
SHA256 b143aa1b825848ea311645ca60905db466559cb78c83b8abb7ab7858fed2e392
MD5 9ccd81a013dfc5479ed6f64f0789eb41
BLAKE2b-256 547a5509460f064ac4510d398a8ec5047ea4aede4c5de11f20bc0677bd08e1d6

See more details on using hashes here.

File details

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

File metadata

  • Download URL: compose-1.2.2-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.2-py35-none-any.whl
Algorithm Hash digest
SHA256 a55d4d2875997012328145d77f23ab033b0e9643d743aaab87fea8c6710facdc
MD5 af0aadaab01c3e44ea05044a8a127e61
BLAKE2b-256 4ebcfd50beb232f010735d330fd65ba1291f5f44c31caaedeec15702bf974f98

See more details on using hashes here.

File details

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

File metadata

  • Download URL: compose-1.2.2-py2.py30-none-any.whl
  • Upload date:
  • Size: 4.0 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.2-py2.py30-none-any.whl
Algorithm Hash digest
SHA256 d1447afb8f38b62e9ff8c0385c195cd14e199139e1d68d6e3d278e80dab71c00
MD5 702c990e21c37f253713f46499b9de9b
BLAKE2b-256 18bcc5305cba235a0f593d58f203fd06b840e3c7cbada99b8c7ab454d1bb1901

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