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.

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, ty)
  • 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.1.tar.gz (73.1 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.1-cp314-cp314t-win_amd64.whl (78.8 kB view details)

Uploaded CPython 3.14tWindows x86-64

aleff-0.3.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (113.6 kB view details)

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

aleff-0.3.1-cp314-cp314t-macosx_11_0_arm64.whl (81.2 kB view details)

Uploaded CPython 3.14tmacOS 11.0+ ARM64

aleff-0.3.1-cp314-cp314t-macosx_10_15_x86_64.whl (80.8 kB view details)

Uploaded CPython 3.14tmacOS 10.15+ x86-64

aleff-0.3.1-cp314-cp314-win_amd64.whl (77.9 kB view details)

Uploaded CPython 3.14Windows x86-64

aleff-0.3.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (104.6 kB view details)

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

aleff-0.3.1-cp314-cp314-macosx_11_0_arm64.whl (80.5 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

aleff-0.3.1-cp314-cp314-macosx_10_15_x86_64.whl (80.2 kB view details)

Uploaded CPython 3.14macOS 10.15+ x86-64

aleff-0.3.1-cp313-cp313-win_amd64.whl (77.3 kB view details)

Uploaded CPython 3.13Windows x86-64

aleff-0.3.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (102.7 kB view details)

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

aleff-0.3.1-cp313-cp313-macosx_11_0_arm64.whl (79.9 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

aleff-0.3.1-cp313-cp313-macosx_10_13_x86_64.whl (79.6 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

aleff-0.3.1-cp312-cp312-win_amd64.whl (77.3 kB view details)

Uploaded CPython 3.12Windows x86-64

aleff-0.3.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (95.8 kB view details)

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

aleff-0.3.1-cp312-cp312-macosx_11_0_arm64.whl (75.9 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

aleff-0.3.1-cp312-cp312-macosx_10_13_x86_64.whl (75.7 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

File details

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

File metadata

  • Download URL: aleff-0.3.1.tar.gz
  • Upload date:
  • Size: 73.1 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.1.tar.gz
Algorithm Hash digest
SHA256 f73d03ec773abf73a6167737eaf5396db3c4ac99219d983094d0a001ae0dde46
MD5 afe5314a9f8181955ae325bf4d704570
BLAKE2b-256 70a77d107ec0b93686dd9cb26aa01c1fe12b190ac9cc3a5dabfd56fe96e4d435

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.3.1.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.1-cp314-cp314t-win_amd64.whl.

File metadata

  • Download URL: aleff-0.3.1-cp314-cp314t-win_amd64.whl
  • Upload date:
  • Size: 78.8 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.1-cp314-cp314t-win_amd64.whl
Algorithm Hash digest
SHA256 99c1bc180f751d5d0577cc77a101f801d2d7629c8fb2616627372c0f2491ba36
MD5 8298072b00a8f6c179c3ea71b1ebff51
BLAKE2b-256 158b6eeaf79446ef1df1919ea398e89797a27e79fab726d6f8d9a2654729b9ad

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.3.1-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.1-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.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 78fae46a63aaab71814a57352809beda0ea97ad1c423369919312522b1996444
MD5 f9a4127e105c731b421544e4edf68826
BLAKE2b-256 8116b264a66d34961051e535ca6ce2d2b525fde28996b455002ff0025eab822c

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.3.1-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.1-cp314-cp314t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for aleff-0.3.1-cp314-cp314t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f74be4385cd85b7d4eebd68443ffafedf62b792c854ebcd1def626f07b773d3b
MD5 65dc5701b10313af4f8ba5301bd2c4b5
BLAKE2b-256 1c44d41e46c569156ab1c7a182d457e71f308e465c87fbf94c8ed7b5a70fc946

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.3.1-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.1-cp314-cp314t-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for aleff-0.3.1-cp314-cp314t-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 537cd7902def97362463485aef26154adf285a6c1dccadacd451854d38941732
MD5 eafe3ff43cdf89466a002c5bf87d70d8
BLAKE2b-256 86106cc60845ff67dfc5d59e15a236df97e91b2eed02bb789ead3c145260036e

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.3.1-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.1-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: aleff-0.3.1-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 77.9 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.1-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 f0e72e0fc36868d3ec01c468bf87bce6cb8828b88e794922d70aaefd209b9968
MD5 115fb00c0a4168b0d3a1c3ddeef8abc2
BLAKE2b-256 c4460472189ff2343f9219b24f4f36273b62cbe920367c8649537fa4cd1a3f66

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.3.1-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.1-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.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 fbfec447d65023f8b59072d686ddff5dda3542cdcf29325247c64334d9f1559f
MD5 12758b74268874ad5862fa2815d6450a
BLAKE2b-256 e20283a5dc0a2cd471459e58bd46ab36bf281a7a831c93685b00f6fd3def4f57

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.3.1-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.1-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for aleff-0.3.1-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8d111568c32292eb478910d6dae769a7fc6051208b24ad7e19efcfea69175384
MD5 19387a7aeb15912da3366f45a7211254
BLAKE2b-256 da33259c8b1a175f6c4833c07611ddc9a592078c98cb4963aa95a8c5de41deb9

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.3.1-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.1-cp314-cp314-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for aleff-0.3.1-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 8c9efe1b3ff4b9560b50a98f66302ab02fe49f04e2fb426bf23f943c0f6876f9
MD5 f03516bd48fb72cc12c00c275f3a855f
BLAKE2b-256 9e53f2cc7594a4409a61ffa1f3504d5fdc747fd717dd4086438eee3fefa7c228

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.3.1-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.1-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: aleff-0.3.1-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 77.3 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.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 5796c2dba81c372d80b9e8d01cf86451357e1dbbb60fc7dace68ea87a784f339
MD5 ca3c911376db96dfc66f116145c3acfd
BLAKE2b-256 6b882c7f09c640187ba69003005dede48b9b3681eed078f85738c2601183b90e

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.3.1-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.1-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.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 30295ce376d2167a71d224c70b6d2e0a8e37ed62a01906992e7fd640f0953f6a
MD5 bac62ab56d73c7d80a195847675dfb5d
BLAKE2b-256 0d8f18d4f3b51c19a3c33ba13db778dd8f9a75f0b2f5543eb60806208c64777f

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.3.1-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.1-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for aleff-0.3.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2b833fba3722a9415d51950fbbdb465f01b9461cb267fe4042c7dabdaf47e166
MD5 50d2648fdf97b38182e17eadd34b87a5
BLAKE2b-256 8da6856eb50b627f91b61b45ef2f294cfb4635f2a91a2619d2718afea39c2aad

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.3.1-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.1-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for aleff-0.3.1-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 59cb7f3a9b5b031fdad6c1d91ba29d0bfcff7d432bf2a8ce486274d0c41f5a0b
MD5 4437bb4b70ced92da07ad37b96937d68
BLAKE2b-256 d34eb69cc78dce69541eb0cc9de00ce322f2016ac7b305ecee9edc8c455e5ee2

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.3.1-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.1-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: aleff-0.3.1-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 77.3 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.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 aeca0c3e74c46179dc72ef058b007a3e6af5188d638933396d048747ae3e0b82
MD5 e52b5c80a2a5b4ebaf2b46491446c668
BLAKE2b-256 030d0befa7f52c73e06c6ebd0d3ba72a960f31a5bd9394711ecb1713cd8cf159

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.3.1-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.1-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.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a58e37bb4da259ec3361e2acdba54c13e5d2ba14f0977f6fd0e818bd3c32aad4
MD5 96fb9c8b9818152286e3a0c90f635aeb
BLAKE2b-256 1ce3782e2cfbe87a0a4866333e46fd53b9585648d239d45c19ada800b06f0580

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.3.1-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.1-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for aleff-0.3.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6dfc6fbaa4e71aad1f6a045597b627219b93c50938eab8db90af85e7020e3e61
MD5 7d233c7884e1fb1afe1c1dc91c35e0d5
BLAKE2b-256 a1fb3d668f7c86e0a32c655abe01fc1977019f9f91a9cd20089ff1b2061724e4

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.3.1-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.1-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for aleff-0.3.1-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 9543aa708ed39e785dea48d55d7b5bef045831cd8237dc7b1e6f5852bce85b24
MD5 5307cc0ace51b550048c26da64148a57
BLAKE2b-256 17104a5b62367d01b5476a64924be38f5780cd343015dc494a6372759d197ee3

See more details on using hashes here.

Provenance

The following attestation bundles were made for aleff-0.3.1-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