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.

An acompose variant is provided which can compose both regular and async functions into an async function.

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 composition to return a regular Python function:

    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.6.tar.gz (4.2 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.6-py38-none-any.whl (4.0 kB view details)

Uploaded Python 3.8

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

Uploaded Python 3.5

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

Uploaded Python 2Python 3.0

File details

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

File metadata

  • Download URL: compose-1.2.6.tar.gz
  • Upload date:
  • Size: 4.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.4.2 requests/2.25.1 setuptools/52.0.0 requests-toolbelt/0.9.1 tqdm/4.57.0 CPython/3.9.2

File hashes

Hashes for compose-1.2.6.tar.gz
Algorithm Hash digest
SHA256 546b6dbf09f18636bb678e48a57134f8219c88bf04db2ea13ee0a950cce156f8
MD5 8813b1cd7c200a1f2ede98f51c9a831e
BLAKE2b-256 79694d9f5fbaf46cec135a453e415bf6871e5d09b8be9f45d5dee6367a58f97d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: compose-1.2.6-py38-none-any.whl
  • Upload date:
  • Size: 4.0 kB
  • Tags: Python 3.8
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.4.2 requests/2.25.1 setuptools/52.0.0 requests-toolbelt/0.9.1 tqdm/4.57.0 CPython/3.9.2

File hashes

Hashes for compose-1.2.6-py38-none-any.whl
Algorithm Hash digest
SHA256 088c986f592a859adef0771da1aa8347f6738b99ea4bc5873163e5e9c766a485
MD5 09c524fc64c63e3f28bd2399321f8e05
BLAKE2b-256 52e08fe2735145c7593c1b822923d3daf0f6a8a079cedaf6b97c209d8ac74c0f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: compose-1.2.6-py35-none-any.whl
  • Upload date:
  • Size: 4.1 kB
  • Tags: Python 3.5
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.4.2 requests/2.25.1 setuptools/52.0.0 requests-toolbelt/0.9.1 tqdm/4.57.0 CPython/3.9.2

File hashes

Hashes for compose-1.2.6-py35-none-any.whl
Algorithm Hash digest
SHA256 bd9cbfa969479e700bad9fd43bd5b15f5327c84ab740ce85076045e51025ba83
MD5 7b7bfd1e1d3fee8da088d7dab6435270
BLAKE2b-256 0fc19996f0e0a4f2b49dc88a0d4d0417c8586e689340cb1a478299bc76698d12

See more details on using hashes here.

File details

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

File metadata

  • Download URL: compose-1.2.6-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.3.0 pkginfo/1.4.2 requests/2.25.1 setuptools/52.0.0 requests-toolbelt/0.9.1 tqdm/4.57.0 CPython/3.9.2

File hashes

Hashes for compose-1.2.6-py2.py30-none-any.whl
Algorithm Hash digest
SHA256 69fbab931bb3496ef6cd81f71170a0ddf446681fb350fd09732c1bab89e40a7c
MD5 629a8e12d6cfa077538e4d368790e2af
BLAKE2b-256 06951f5f3f024f499d1d049269aa9630fef70736ab9ce16bc6bcd4ba0321f3da

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