Skip to main content

Algebraic effects for Python — deep and shallow, stateful, composable, multi-shot handlers

Project description

aleff

Algebraic effects for Python — deep and shallow, stateful, composable, multi-shot handlers.

Doc | PyPI | GitHub

from aleff import effect, create_handler

choose = effect("choose")
h = create_handler(choose)

@h.on(choose)
def _(k, *values):
    return sum((k(v) for v in values), [])

print(h(lambda: [choose("A", "B") + choose("C", "D")]))
# ['AC', 'AD', 'BC', 'BD']

Features

  • Deep handlers — effects propagate through nested function calls without annotation
  • Shallow handlers — handle an effect once, then delegate re-installation to the handler function; enables state machines, shift0/reset0, and strategy changes between invocations
  • Stateful handlers — handlers can maintain and update state across multiple effect invocations, either via mutable variables (deep) or re-installation with new state (shallow); enables get/put state, transactions, and reverse-mode AD
  • Multi-shot continuationsresume can be called multiple times in a single handler, enabling backtracking search, non-determinism, and other advanced patterns
  • Sync and async — both synchronous (Handler) and asynchronous (AsyncHandler) handlers are supported, with transparent bridging between the two
  • Effect composition — handler functions can perform effects themselves, dispatched to enclosing handlers; enables layered architectures and modular effect stacking
  • Dynamic windwind context manager establishes before/after guards that are re-invoked on multi-shot re-entry, with optional auto-management of context managers returned by before
  • Effect annotation@effect(step1, step2) collects effect sets transitively from decorated functions
  • Introspectioneffects(fn) and unhandled_effects(fn, h) for querying and validating effect coverage
  • Typed — effect parameters and return types are checked by type checkers (pyright)
  • No macros, no code generation — pure Python library built on greenlet and a small CPython C extension

Requirements

  • CPython >=3.12
    • Tested versions:
      • 3.12.13
      • 3.13.12
      • 3.14.3
      • 3.14.3t (free-threaded)
  • greenlet >= 3.3.2
  • Linux / macOS / Windows

Installation

# uv
uv add aleff

# pip
pip install aleff

Quick start

from aleff import effect, Effect, Resume, create_handler

# Define effects
read: Effect[[], str] = effect("read")
write: Effect[[str], int] = effect("write")

# Write business logic using effects
def run():
    s = read()
    return write(s)

# Provide handler implementations
h = create_handler(read, write)

@h.on(read)
def _read(k: Resume[str, int]):
    return k("file contents")

@h.on(write)
def _write(k: Resume[int, int], contents: str):
    print(f"writing: {contents}")
    return k(len(contents))

result = h(run)
print(result)  # 13

Multi-shot example

from aleff import effect, Effect, Handler, Resume, create_handler

choose: Effect[[int], int] = effect("choose")

h: Handler[list[int]] = create_handler(choose)

@h.on(choose)
def _choose(k: Resume[int, list[int]], n: int):
    # Resume once for each choice and collect all results
    results: list[int] = []
    for i in range(n):
        results += k(i)
    return results

def computation():
    x = choose(3)  # 0, 1, or 2
    y = choose(2)  # 0 or 1
    return [x * 10 + y]

result = h(computation)
print(result)  # [0, 1, 10, 11, 20, 21]

Effect composition

Handler functions can perform effects that are handled by enclosing handlers:

from aleff import effect, Effect, Resume, create_handler

log: Effect[[str], None] = effect("log")
parse: Effect[[str], int] = effect("parse")

# Outer handler: logging
h_log = create_handler(log)

@h_log.on(log)
def _log(k: Resume[None, int], msg: str):
    print(f"[LOG] {msg}")
    return k(None)

# Inner handler: parsing with logging
h_parse = create_handler(parse)

@h_parse.on(parse)
def _parse(k: Resume[int, int], s: str):
    log(f"parsing: {s}")       # handled by the outer handler
    return k(int(s))

result = h_log(lambda: h_parse(lambda: parse("42") + 1))
# prints: [LOG] parsing: 42
print(result)  # 43

Dynamic wind

The wind context manager establishes before/after guards around a dynamic extent. When a multi-shot continuation captured inside the with block is resumed, the before thunk is called again; when it exits, the after thunk runs.

from aleff import effect, Effect, Resume, Handler, create_handler, wind

choose: Effect[[], int] = effect("choose")
h: Handler[list[int]] = create_handler(choose)

@h.on(choose)
def _choose(k: Resume[int, list[int]]):
    return k(1) + k(2)

log: list[str] = []

def run() -> list[int]:
    with wind(lambda: log.append("before"), lambda: log.append("after")):
        return [choose() * 10]

result = h(run)
print(result)  # [10, 20]
print(log)     # ['before', 'after', 'before', 'after']

If before returns a context manager and auto_exit=True (the default), __enter__ and __exit__ are called automatically:

with wind(lambda: open("data.txt")) as ref:
    ref.unwrap().read()
# file is closed on exit

wind_range is a multi-shot-safe replacement for range() in for loops. Python's range() iterator is shared across shots and exhausted after the first; wind_range saves and restores the iterator position automatically:

with wind_range(n) as r:
    for i in r:
        v = choose()  # multi-shot safe

How it works

Effects are declared as typed values and invoked like regular function calls. A Handler intercepts these calls via greenlet-based context switching:

  1. Business logic runs in a greenlet
  2. When an effect is invoked, control switches to the handler
  3. The handler processes the effect and calls resume(value) to return a value
  4. If resume is called multiple times, each call restores a snapshot of the continuation's frames (multi-shot)
  5. If the handler returns without calling resume, the computation is aborted (early exit)

Because handlers use greenlets (not exceptions), the control flow is:

  • Transparent — no yield, await, or special syntax in business logic
  • Non-stack-cutting — code after resume in the handler runs after the continuation completes, enabling reverse-order execution (useful for backpropagation, transactions, etc.)

Multi-shot continuations are implemented via a CPython C extension (aleff._multishot.v1._aleff) that snapshots and restores interpreter frame chains.

Package structure

Package Description
aleff Default: re-exports aleff.multishot (multi-shot handlers)
aleff.multishot Multi-shot handlers with frame snapshot/restore
aleff.oneshot One-shot handlers (no C extension required)

Examples

See examples/ for demonstrations:

  • N-Queens — backtracking search via multi-shot continuations
  • Amb / Logic puzzle — Scheme-style amb operator and constraint solving (SICP Exercise 4.42)
  • Probability — exact discrete probability distributions via weighted multi-shot
  • Dependency injection — swap DB/email/logging implementations
  • Record/Replay — record effect results, replay without side effects
  • Transactions — buffer writes, commit on success, rollback on failure
  • Automatic differentiation — forward-mode (dual numbers) and reverse-mode (backpropagation) with the same math expressions
  • Shallow state machine — mutable state (get/put) and traffic light controller via shallow handler re-installation
  • shift/reset, shift0/reset0 — delimited continuations: deep = shift/reset, shallow = shift0/reset0, with generator example

API reference

Function / Class Description
effect("name") Create a new Effect
@effect(e1, e2, ...) Decorate a function to declare its effects
create_handler(*effects, shallow=False) Create a synchronous handler
create_async_handler(*effects, shallow=False) Create an asynchronous handler
h.on(effect) Register a handler function (decorator)
h(caller) Run caller with the handler active
effects(fn) Get the declared effect set of a function
unhandled_effects(fn, *handlers) Get effects not covered by the given handlers
Effect[P, R] Effect protocol (parameters P, return type R)
Handler[V] Sync handler protocol
AsyncHandler[V] Async handler protocol
Resume[R, V] Sync continuation (k(value) -> V)
ResumeAsync[R, V] Async continuation (await k(value) -> V)
wind(before, after, *, auto_exit=True) Dynamic wind context manager
wind_range(stop) / wind_range(start, stop, step) Multi-shot-safe range() for for loops
Ref[T] Reference wrapper returned by wind; call unwrap() to get the value

Development

From source:

git clone https://github.com/hnmr293/aleff.git
cd aleff
uv sync
# Run tests
uv run pytest

# Run tests on all supported Python versions
./run_tests.sh

# Format
uv run ruff format

# Lint
uv run pyright

License

Apache-2.0

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

aleff-0.3.2.tar.gz (74.0 kB view details)

Uploaded Source

Built Distributions

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

aleff-0.3.2-cp314-cp314t-win_amd64.whl (79.7 kB view details)

Uploaded CPython 3.14tWindows x86-64

aleff-0.3.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (114.5 kB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

aleff-0.3.2-cp314-cp314t-macosx_11_0_arm64.whl (82.1 kB view details)

Uploaded CPython 3.14tmacOS 11.0+ ARM64

aleff-0.3.2-cp314-cp314t-macosx_10_15_x86_64.whl (81.7 kB view details)

Uploaded CPython 3.14tmacOS 10.15+ x86-64

aleff-0.3.2-cp314-cp314-win_amd64.whl (78.8 kB view details)

Uploaded CPython 3.14Windows x86-64

aleff-0.3.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (105.5 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

aleff-0.3.2-cp314-cp314-macosx_11_0_arm64.whl (81.4 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

aleff-0.3.2-cp314-cp314-macosx_10_15_x86_64.whl (81.1 kB view details)

Uploaded CPython 3.14macOS 10.15+ x86-64

aleff-0.3.2-cp313-cp313-win_amd64.whl (78.2 kB view details)

Uploaded CPython 3.13Windows x86-64

aleff-0.3.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (103.6 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

aleff-0.3.2-cp313-cp313-macosx_11_0_arm64.whl (80.8 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

aleff-0.3.2-cp313-cp313-macosx_10_13_x86_64.whl (80.5 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

aleff-0.3.2-cp312-cp312-win_amd64.whl (78.2 kB view details)

Uploaded CPython 3.12Windows x86-64

aleff-0.3.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (96.7 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

aleff-0.3.2-cp312-cp312-macosx_11_0_arm64.whl (76.8 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

aleff-0.3.2-cp312-cp312-macosx_10_13_x86_64.whl (76.6 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

File details

Details for the file aleff-0.3.2.tar.gz.

File metadata

  • Download URL: aleff-0.3.2.tar.gz
  • Upload date:
  • Size: 74.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for aleff-0.3.2.tar.gz
Algorithm Hash digest
SHA256 821bddc8e8d75fad506979d14241861e08e2d6ef17769661ece6b8b32238d66a
MD5 f699ff7a9b7f364fbb96982a083c1829
BLAKE2b-256 74cb7d5231591c5016fe40611a9a3b32123c658eda9f0bd20156d475e331849b

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.3.2.tar.gz:

Publisher: publish.yml on hnmr293/aleff

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file aleff-0.3.2-cp314-cp314t-win_amd64.whl.

File metadata

  • Download URL: aleff-0.3.2-cp314-cp314t-win_amd64.whl
  • Upload date:
  • Size: 79.7 kB
  • Tags: CPython 3.14t, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for aleff-0.3.2-cp314-cp314t-win_amd64.whl
Algorithm Hash digest
SHA256 63be6ed7aa47182ea9d39a944293078c4aecaf1bc99145f4413f68023f7e1877
MD5 f050eb0f09cae5380f6f94628dc14a18
BLAKE2b-256 12abfb9adff49fb7c89b7ff15c2d15603553eb3c527e1bf96f206d53920130c0

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.3.2-cp314-cp314t-win_amd64.whl:

Publisher: publish.yml on hnmr293/aleff

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file aleff-0.3.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for aleff-0.3.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 bcd3a7b37796b2cd7737b45e44c3c58e5238dc0dabf1c377c8f5c090bd2cae47
MD5 b94551f3b419a78b7d871ccd962fdfcf
BLAKE2b-256 cf3103ea152d283fda585e4395aad0e646ab75587d0bfd8789e75e1e1ac33fd2

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.3.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: publish.yml on hnmr293/aleff

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file aleff-0.3.2-cp314-cp314t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for aleff-0.3.2-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 75f000d9c47cb2719da70bbe8e3b7a228352db702cba51f4bbb373f5d6b140d5
MD5 a9546165878ec4652b1dac13e2b26cb6
BLAKE2b-256 aa45a6b4a41c4d1fb7cb69af5aea83d6b69458921b1e42c7cc5733bcfd0e981e

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.3.2-cp314-cp314t-macosx_11_0_arm64.whl:

Publisher: publish.yml on hnmr293/aleff

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file aleff-0.3.2-cp314-cp314t-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for aleff-0.3.2-cp314-cp314t-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 f2e3ea075c90d9416c3356a14c322ecc93aa08ed497ab7cf810b3eef60ad96e2
MD5 faf35d8e710105d8c3dfc2f81c1f4dd8
BLAKE2b-256 3df221cc6f9bedd6544dd260fbd1df68df84e807fd9bad41eab491f883272cae

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.3.2-cp314-cp314t-macosx_10_15_x86_64.whl:

Publisher: publish.yml on hnmr293/aleff

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file aleff-0.3.2-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: aleff-0.3.2-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 78.8 kB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for aleff-0.3.2-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 d2838f9a82ac648415d6b5ee4b85a1239c9561665fbacaa1bea6d98a8e502b0a
MD5 52caf02fbb50274c8b15f24ecaf12314
BLAKE2b-256 92e5fc499890ed0256fc3d868600f072677819b55509933ec262dfbcce36cb90

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.3.2-cp314-cp314-win_amd64.whl:

Publisher: publish.yml on hnmr293/aleff

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file aleff-0.3.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for aleff-0.3.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c39f901bb5b69d4040780fe3d6983550ef511b9b89b65871098233ba831efcd1
MD5 ee36f0ad9965b0331bb24d7baa696d40
BLAKE2b-256 35ae40884d63e57023ddf7ee4d6e91c53c06b964dab0c2f13f035c80c79d3f1b

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.3.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: publish.yml on hnmr293/aleff

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file aleff-0.3.2-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for aleff-0.3.2-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 956ec93f3100f2821ccb09d8d6ec36178212764ed825d861e6af1c9bf67a210b
MD5 fa8dc09b32bd59ff8e49d7d90ef9b5d1
BLAKE2b-256 affc88392fb65fe4acc3b3e07b7f0a1e235941cd3b2df896fc66cd5d66c1aa87

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.3.2-cp314-cp314-macosx_11_0_arm64.whl:

Publisher: publish.yml on hnmr293/aleff

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file aleff-0.3.2-cp314-cp314-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for aleff-0.3.2-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 4a8455cce9c240d36ce7f8d61b94b825babadb691abaffca48770ba53ab907da
MD5 85bc1eb45b370a407f3b1611aef77741
BLAKE2b-256 975a6c0b9a6bccef3a30145f62bb5625a603789e9cd972e57a0380b279191ad8

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.3.2-cp314-cp314-macosx_10_15_x86_64.whl:

Publisher: publish.yml on hnmr293/aleff

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file aleff-0.3.2-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: aleff-0.3.2-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 78.2 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for aleff-0.3.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 96a224955cf07369ef8a768fff6bf61896e7cea39d2675bd37fd14400107b0b8
MD5 b39fb3488beab78a10a16129da307174
BLAKE2b-256 944d449adac93240b9bc84aaa104b58fe282b64a7731976ce5fb115860bb5f5f

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.3.2-cp313-cp313-win_amd64.whl:

Publisher: publish.yml on hnmr293/aleff

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file aleff-0.3.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for aleff-0.3.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 fd974b12b495aadfb57cbe4e1ce2cdde54ddfcfbae078c8bc4a76cfd1d07da50
MD5 00a4a31557fe3c991fc96d2033e83530
BLAKE2b-256 3977efbdbfa1a2f14f67422775fae77f743c3579626814042d5cff98298fa9f6

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.3.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: publish.yml on hnmr293/aleff

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file aleff-0.3.2-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for aleff-0.3.2-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 db31327a6fd93de53768af932d0f396cb76f12067e16daceb7a811b3305149e8
MD5 9911eb66fc2481f2b334af6b7d246fee
BLAKE2b-256 c89bc9c57ffd50ff0691f43b8417761a6013ac60201333977fd7787f6304cf1c

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.3.2-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: publish.yml on hnmr293/aleff

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file aleff-0.3.2-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for aleff-0.3.2-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 606d8038824022832408e7270d110209cfab5371c1c0ab12760324a49dd39c15
MD5 81a9ac48e4c3a62945abfeeb7cb25458
BLAKE2b-256 f53820a0787d59f0f7321ab0dc6ab69d83d495a25bdbcbe8030e2759f80cc738

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.3.2-cp313-cp313-macosx_10_13_x86_64.whl:

Publisher: publish.yml on hnmr293/aleff

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file aleff-0.3.2-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: aleff-0.3.2-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 78.2 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for aleff-0.3.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 873a6d4e7fab5069c09ea3ccd18f17da4dbb5e44e17e5902b8a2b7cbe29204a2
MD5 afae29f51c12cb832957323c7db7d9c8
BLAKE2b-256 68a1f72d82121ef8d1460d81e77c125b412e465650d28fd71deb2baa4a7b5e09

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.3.2-cp312-cp312-win_amd64.whl:

Publisher: publish.yml on hnmr293/aleff

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file aleff-0.3.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for aleff-0.3.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a9d2b8cfe5af9c361335c4e92b4ad4cc2659157f5531072afb7af5ac81464f2b
MD5 2afb200dff886cb95419b1a4fc79a778
BLAKE2b-256 b315e6c25c1a06c1a7211db5e9df170ee8ac9299fd804d5cb96ddf5aaa7fb1ff

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.3.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: publish.yml on hnmr293/aleff

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file aleff-0.3.2-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for aleff-0.3.2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9d7fbcbd042b2fa664f1deb109e18d42e101dcc1731433f9d62c528de2a183cb
MD5 1b2d6457e1c8b1836321c77a4faa865e
BLAKE2b-256 3ede1709812921d5286b67aee5efcb79cd53cb3117850f9d55beafc2237e63b2

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.3.2-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: publish.yml on hnmr293/aleff

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file aleff-0.3.2-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for aleff-0.3.2-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 ee298a34c59cffae26ef8aa8b7ee3ba2c0613aa0f7733abede76dde841a75e66
MD5 67829ddc2f1fa4be136d1916d4bef9ea
BLAKE2b-256 58d9b439ce430dd2baf6bc3c10cf5ffb0a0a49247bafc32c257964224a9037ef

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.3.2-cp312-cp312-macosx_10_13_x86_64.whl:

Publisher: publish.yml on hnmr293/aleff

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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