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.4.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.4-py38-none-any.whl (4.1 kB view details)

Uploaded Python 3.8

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

Uploaded Python 3.5

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

Uploaded Python 2Python 3.0

File details

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

File metadata

  • Download URL: compose-1.2.4.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.4.tar.gz
Algorithm Hash digest
SHA256 dfc3f972f7179272375f5d2372f4beba39b3ce77820128a7391230de6f9a83bd
MD5 54039db63d1d5fbed8db33ef5841e531
BLAKE2b-256 35a2125e54f36fbc2c6473702becdef7bd63c68df42f785af4cf2620970f4a9d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: compose-1.2.4-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.4-py38-none-any.whl
Algorithm Hash digest
SHA256 8b7b39be5c15dd5fe0a9bdae0ee78e7fcccc7f95a1306655b3639e9d219a86c0
MD5 04785fca00c4b337c165ffd715b2f39b
BLAKE2b-256 b16886dd1d1315ec9c6b7933dfea1d69800bdef2055f14aa425208a4ae45d0e6

See more details on using hashes here.

File details

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

File metadata

  • Download URL: compose-1.2.4-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.4-py35-none-any.whl
Algorithm Hash digest
SHA256 a0154a8f912a9ec757c666cccd903be607807d5c5aeaf58d5359e21e1e215c5e
MD5 7ddcc2434218bd3fed936299a4780ec2
BLAKE2b-256 2f39135362dcf491cc85b0ed6a5577eecba65c07d08137a1685ce18b6c5280c4

See more details on using hashes here.

File details

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

File metadata

  • Download URL: compose-1.2.4-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.4-py2.py30-none-any.whl
Algorithm Hash digest
SHA256 e0458104c30287151edd8d47d1deb20c1659ab1a624819a535adc6914060fe84
MD5 ba9d93e38f3305f3bd894c1be09916da
BLAKE2b-256 8e15d458513eab388e9a3d66957e489e70c96de3d64cea7001af5b04058a09d6

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