Skip to main content

A library for lazy evaluation with context caching

Project description

lazily

Lazy reactive primitives for Python — Slots, Cells, and Signals with automatic dependency tracking and cache invalidation, plus the language-agnostic lazily-spec wire protocol for mirroring graph state across processes and languages.

PyPI

Overview

lazily provides a small reactive family for context-aware computation:

  • Slot — a lazily-computed cached value that automatically tracks its dependencies (slot / slot_def).
  • Cell — a mutable value that invalidates dependent Slots when it changes (cell / cell_def, Cell, CellSlot).
  • Signal — an eager derived value that recomputes the instant a dependency invalidates, with no intermediate unset value (signal / signal_def).

Values are lazy by default: dependents are marked dirty on invalidation but only recompute when accessed. When you need eager push-style semantics — recompute immediately, observe v1 → v2 with no unset window — reach for Signal, which layers a puller over a memoized Slot. The Slot → Cell → Signal progression lets you choose lazy or eager per derived value within one graph. An equal recompute is suppressed by a PartialEq/memo guard, so unchanged values never cascade downstream work.

There is no dedicated Context class — a plain dict is the context. Slots use themselves as dictionary keys to cache values, so any dict works as the reactive "world."

Feature coverage

The full lazily capability set across every binding. Legend: ✅ shipped · ~ partial · absent or not applicable. The canonical matrix with per-cell notes and platform carve-outs lives in lazily-spec § Cross-Language Coverage.

Feature Rust Python Kotlin JS Dart Zig Go C++
Reactive graph — core Cell / Slot / Effect (+ derived Signal = Slot.eager) / memo / batch
Keyed-map materialization (SlotMap) — mint-on-access derived slots: transparency + deferral (#lzmatmode)
Thread-safe keyed map (ThreadSafeSlotMap) — Send + Sync + materialization confluence (#lzmatmode)
Async keyed map (AsyncSlotMap) — eventual transparency (#lzmatmode)
Keyed-map sync — membership propagation + materialize-on-ingest + derived-aggregate transparency (#lzfamilysync)
Thread-safe context (lock-backed)
Async reactive context
Flat state machine
Harel state charts
Keyed reactive maps (ReactiveMap: CellMap / SlotMap) + CellTree + reconcile
Memoized semantic tree (SemTree)
Stable-id alignment (manufactured identity)
Reactive queue (QueueCell SPSC/MPSC + QueueStorage adapter)
Broadcast topic (TopicCell) — independent cursors + durable replay + safe GC (#lztopiccell)
Competing-consumer work queue (WorkQueueCell) — exclusive leases + ack/nack + redelivery + DLQ (#lzworkqueue)
Merge algebra + MergeCell — associative MergePolicy (KeepLatest/Sum/Max/SetUnion/RawFifo), Cell ≡ MergeCell<KeepLatest>, Reactive/Source split (#relaycell)
RelayCell — conflating relay + BackpressurePolicy + SpillStore + Transport + Inbox/Outbox + Rate/Window/Expiry/Priority/keyed policies (#relaycell)
Free-text character CRDT (TextCrdt)
TextCrdt delta sync (version_vector / delta_since / apply_delta)
CrdtTree lossless document contract (#lzcrdttree)
Move-aware sequence CRDT (SeqCrdt)
Lossless tree CRDT core (LosslessTreeCrdt, M1)
Lossless tree — dotted-frontier anti-entropy
Lossless tree — concurrent merge convergence
Registers (LWW / MV) + PnCounter + CellCrdt
IPC wire — Snapshot + Delta + CrdtSync
Shared-memory blob path (ShmBlobArena)
Cross-process zero-copy transport (BlobBackend / shm / arrow)
Distributed CRDT plane (CrdtPlaneRuntime / anti-entropy)
Reliable sync — resync coordinator + at-least-once durable outbox + OR-set/LWW liveness (#lzsync)
Storage-independent durable outbox (OutboxStore + shared outbox protocol; SQLite/Room/IndexedDB/file adapters)
Reliable-sync transport seam + full-duplex SyncDriver loop (IpcSink/IpcSource, #sync-driver)
Distributed plane — WebRTC transport + signaling
State projection / mirror
Causal receipts (CausalReceipts outcome projection)
Message-passing + RPC command plane (command-plane-v1)
C-ABI FFI boundary
Permission boundary (PeerPermissions / RemoteOp)
Capability negotiation (SessionHandshake)
Instrumentation / benchmarks
Temporal sources — TimerCell / IntervalCell / CronCell / DeadlineCell over a logical clock (#lztime)
Rate-shaping operators — DebounceCell / ThrottleCell / SampleCell / ProbabilisticSampleCell (#lzrateshape)
Membership + failure detection — MembershipCell (SWIM + Phi-accrual) / PeerSet / PeerChangeEvent (#lzmemb)
Distributed coordination — LeaseCell / LeaderCell / LockCell / SemaphoreCell / BarrierCell+QuorumCell (#lzcoord)
Presence + ephemeral plane — PresenceCell / AwarenessCell / EphemeralCell + Ephemeral/Durable markers (#lzpresence)
Stream windowing — TumblingWindow / SlidingWindow / SessionWindow over the merge algebra (#lzwindow)
Fault tolerance — CircuitBreakerCell / RetryPolicyCell / BulkheadCell / TimeoutCell (#lzresilience)
Embedded-service plane — HealthCell / ReadinessCell / DiscoveryCell / ServiceRegistry (#lzservice)

Installation

pip install lazily

Example usage

from lazily import CellSlot, cell, slot

# Cells hold a value that can be updated.
name = CellSlot[dict, dict, str]()


# Slots are functions that depend on cells and other slots.
@slot
def greeting(ctx: dict) -> str:
    print("Calculating greeting...")
    return f"Hello, {name(ctx).value}!"


# A CellSlot can also have a default value.
@cell
def response(ctx: dict) -> str:
    return "How are you?"


@slot
def greeting_and_response(ctx: dict) -> str:
    print("Calculating greeting_and_response...")
    return f"{greeting(ctx)} {response(ctx).value}"


ctx = {}

name(ctx).value = "World"

# First access: runs the function
print(greeting(ctx))
# Calculating greeting...
# 'Hello, World!'

# Second access: uses cache (no print)
print(greeting(ctx))
# 'Hello, World!'

# Dependencies also access cached values
print(greeting_and_response(ctx))
# Calculating greeting_and_response...
# 'Hello, World! How are you?'

# Dependencies also cached
print(greeting_and_response(ctx))
# 'Hello, World! How are you?'

# Update cell: invalidates cache
name(ctx).value = "Lazily"

# Access again: re-runs the function
print(greeting_and_response(ctx))
# Calculating greeting_and_response...
# Calculating greeting...
# 'Hello, Lazily! How are you?'

# Another access: uses cache
print(greeting_and_response(ctx))
# 'Hello, Lazily! How are you?'

Core Concepts

Context

A plain dict is the context. It owns all cached Slot values; Slots store their cache under themselves as keys. The current implementation is single-threaded — create one dict per reactive graph.

Slot

A Slot wraps a compute function (ctx) -> T; the result is cached after first access. Dependencies are discovered automatically via a global slot_stack — any Slot or Cell read during computation becomes a dependency and re-subscribes on every recompute, so conditional branches update the dependency graph with no manual cleanup. When a dependency invalidates, the Slot only marks its cache dirty; it does not recompute until called again.

Type Purpose
BaseSlot[C_in, C_ctx, T] Base slot without subscriber support
Slot[C_in, C_ctx, T] Slot with dependency tracking and invalidation
slot Decorator: Slot with an identity context resolver
slot_def(resolve_ctx) Decorator factory for a custom context resolver

Cell

A Cell holds a mutable value. Reading cell.value inside a Slot auto-subscribes that Slot; assigning cell.value = x (or cell.set(x)) compares old and new via != and, only if changed, cascades invalidation to dependents.

Type Purpose
Cell[T] Mutable value with subscription support
CellSlot[C_in, C_ctx, T] Slot that returns a Cell
cell Decorator: CellSlot with an identity resolver
cell_def(resolve_ctx) Decorator factory for a custom context resolver

Signal

A Signal is the eager counterpart to a lazy Slot — one step further along the Slot → Cell → Signal progression. Where a Slot marks itself dirty on invalidation and recomputes on the next read, a Signal recomputes the instant a dependency is invalidated, before the mutating call returns. The value is always materialized, so observers never see an intermediate unset value.

from lazily import CellSlot, signal

n = CellSlot[dict, dict, int]()


@signal
def doubled(ctx: dict) -> int:
    return n(ctx).value * 2


ctx: dict = {}
n(ctx).value = 1

s = doubled(ctx)   # eager: materialized now
print(s.value)     # 2

n(ctx).value = 5   # doubled recomputes immediately
print(s.value)     # 10 — already current, no lazy read needed

A Signal is composed from existing primitives, not a parallel engine: a memoized Slot supplies glitch-free, memo-guarded recomputation, and a small puller re-materializes it after every invalidation to supply the eagerness. Consequently a Signal inherits the memo guard (an equal recompute suppresses the downstream cascade). signal.dispose() removes the eager puller — the value stays readable but reverts to lazy (recompute-on-read) behavior.

Type Purpose
Signal[T] Eager derived value bound to a single context
signal Decorator: context-cached eager-Signal factory (one Signal per context)
signal_def(resolve_ctx) Decorator factory with a custom context resolver

StateMachine

StateMachine[S, E] is a finite state machine backed by a reactive Cell, so its state participates in dependency tracking like any other reactive value. Construct it with StateMachine(ctx, initial, transition) where transition is a pure (state, event) -> next_state | None (returning None rejects the event). send(event) returns whether the transition was accepted; a self-transition to an equal state is accepted but suppressed by the Cell's PartialEq guard.

Reactive collections, async, and thread-safe contexts

lazily-py also implements the lazily-spec compute-layer MUSTs, each ported from its Lean formal model in lazily-formal:

  • ReactiveMap / CellMap / SlotMap / CellTree — keyed reactive collections (#reactivemap) with independent value/membership/order signals and atomic move. One generic ReactiveMap over a handle kind; CellMap (input cells, adds set + eager entry) and SlotMap (derived slots, lazy get_or_insert_with + eager materialize_all) are its specializations.
  • QueueCell — a reactive FIFO queue (SPSC primitive with an MPSC-via-batch usage rule) with a pluggable QueueStorage backend. Reader-kind invalidation (head/len/is_empty/is_full/closed), bounded reactive backpressure via is_full, and the closure lifecycle (drain / Closed-distinct-from-Empty / idempotent).
  • reconcile_ops — move-minimized keyed reconciliation (LIS kernel).
  • AsyncSlot / AsyncEffect — the async slot lifecycle with stale-completion discard, and cleanup-before-body effect scheduling.
  • ThreadSafeContext — a lock-serialized batch boundary that coalesces writes into one invalidation pass.
  • lazily.ffi — the C-ABI FFI boundary (LazilyFfiStatus, LazilyFfiMessageKind incl. CrdtSync = 3, LazilyFfiBytes).

The test suite gates on lazily-formal's lake build (every theorem checks) and mirrors the named Lean theorems as property tests. See SPEC.md for the full compliance surface.

Reactive queue — lazily.queue

QueueCell is a FIFO collection composed of reactive cells — not a new cell kind — that adds queue semantics (push to tail, pop from head) to the reactive graph. It is an SPSC primitive; MPSC is a usage rule on the same primitive — multiple producers push inside one batch, which serializes the pushes into a deterministic order. The reactive shell wraps a pluggable QueueStorage backend (default VecDequeStorage); the shell owns the reader-kind version cells and invalidates by reader kind — a push to a non-empty queue does NOT invalidate the head reader, a pop does.

from lazily import QueueCell, QueuePopError, batch

ctx = {}
q: QueueCell[str] = QueueCell(ctx)

q.try_push("a")
q.try_push("b")
assert q.head() == "a"
assert q.len() == 2
assert q.try_pop() == "a"

# Bounded queue → reactive backpressure via is_full.
bq = QueueCell[int].with_capacity(ctx, 2)
bq.try_push(1)
bq.try_push(2)
assert bq.is_full()
assert bq.try_push(3).label == "Full"   # reject at capacity
assert bq.try_pop() == 1
assert not bq.is_full()                  # pop freed a slot → is_full reader invalidated

# MPSC: multiple producers push inside one batch → one invalidation pass.
batch(lambda: (q.try_push("p1"), q.try_push("p2")))

# Closure: pop on closed+empty returns Closed (distinct from Empty).
q.close()
assert q.is_closed()
assert q.try_push("x").label == "Closed"

Competing-consumer work queue

WorkQueueCell provides exclusive FIFO claims with visibility deadlines, worker-scoped acknowledgements, tail retries, and bounded dead-letter handling. Item ids survive retries while each claim gets a fresh delivery id.

from lazily import WorkQueueCell

work = WorkQueueCell[str](ctx, visibility_timeout=10, max_deliveries=3)
work.push("job")
delivery = work.claim("worker-a", 100)
assert delivery is not None
assert work.ack("worker-a", delivery.delivery_id)

The reader-kind independence law (a push to a non-empty queue does not change head, so the head reader is not invalidated) comes for free from the Cell != (PartialEq) guard: after each op the shell re-derives each reader-kind cell from storage and writes it back, and a cell whose value did not change is not invalidated.

IPC — the lazily-spec wire protocol

lazily.ipc implements the language-agnostic lazily-spec wire protocol, so a Python graph's state can be mirrored to remote observers across processes and languages. The JSON encoding is byte-compatible with the Rust (lazily-rs), Zig (lazily-zig), and TypeScript (@lazily/signaling) bindings, and is validated against the canonical lazily-spec/conformance fixtures (vendored under tests/conformance/).

Two message kinds flow over any transport (WebSocket text, WebRTC data, FFI buffer):

  • Snapshot — the full graph state at an epoch (nodes, edges, roots).
  • Delta — an ordered batch of the 7 DeltaOp variants (CellSet, SlotValue, Invalidate, NodeAdd, NodeRemove, EdgeAdd, EdgeRemove) applied with epoch sequencing and fail-closed resync.
from lazily import (
    Snapshot, NodeSnapshot, EdgeSnapshot, ShmBlobRef,
    Delta, DeltaOp, IpcMessage,
)

# Build and serialize a snapshot — encode_json() returns transport-agnostic bytes.
snap = Snapshot(
    epoch=7,
    nodes=[
        NodeSnapshot.payload(1, "i32", bytes([1, 2, 3])),
        NodeSnapshot.opaque(2, "opaque-type"),
        NodeSnapshot.shared_blob(3, "text/plain", ShmBlobRef(0, 16, 1, 7, 999)),
    ],
    edges=[EdgeSnapshot(2, 1), EdgeSnapshot(3, 1)],
    roots=[1, 2],
)
wire = IpcMessage.of_snapshot(snap).encode_json()
assert IpcMessage.decode_json(wire).snapshot == snap

# An incremental delta carrying mutations.
delta = Delta.next(40, [
    DeltaOp.cell_set(1, bytes([10])),
    DeltaOp.invalidate(3),
])
IpcMessage.of_delta(delta).encode_json()

A PeerPermissions boundary gates what is shared: it is default-deny, so only nodes a peer is explicitly allowed to read are serialized into a snapshot or delta — non-allowlisted nodes are omitted entirely.

Shared-memory blobs — ShmBlobArena

ShmBlobArena lets a Python process host blob payloads (not just carry ShmBlobRef descriptors). It is a bytearray-backed, append-only arena with a 40-byte header (LZSH magic + FNV-1a-64 checksum) and wraparound, ported from the lazily-rs ShmBlobArena<B> and byte-compatible with the Rust and Zig arenas. The module exports ShmBlobArena, ShmBlobArenaError (with its variant subclasses), and SHM_BLOB_HEADER_LEN.

Lossless tree CRDT — lazily.lossless_tree_crdt

LosslessTreeCrdt (#lzlosstree) is a single rooted concrete-syntax tree whose leaves own every rendered byterender(tree) == source_text for valid, invalid, and unknown source alike. Where TextCrdt is a flat lossless floor, this is the structured tree that can itself be the wire authority. Element nodes own structure only; all text lives in leaf nodes tagged Token / Trivia / Raw / Error, so unknown/invalid spans round-trip exactly as Raw/Error leaves rather than being discarded.

from lazily import LeafKind, LosslessTreeCrdt, SeedElement, SeedLeaf
from lazily.lossless_tree_crdt import ROOT

tree = LosslessTreeCrdt(peer=1)
heading = tree.create_node(ROOT, None, SeedElement("heading"))
tree.create_node(heading, None, SeedLeaf(LeafKind.TOKEN, "# "))
title = tree.create_node(heading, None, SeedLeaf(LeafKind.RAW, "Título"))
assert tree.render() == "# Título"

# Op-based delta sync: fork, diverge, converge through a dotted frontier.
other = tree.fork(peer=2)
other.edit_leaf(title, 0, 0, "X")
tree.apply_update(other.diff(tree.frontier()))
assert tree.render() == other.render()

Leaf text embeds TextCrdt wholesale; child order is a fractional index (key_between); the clock is a Lamport TreeOpId. Anti-entropy is op-based over a dotted, non-contiguous version frontier (TreeVersionFrontier) — a dot set (contiguous prefix + sparse holes), never a per-peer max, so a missing interior op stays representable and re-requestable. Leaf-local wire offsets are UTF-8 bytes (byte_to_char). The wire codec (tree_update_to_wire / tree_update_from_wire) validates against lazily-spec's lossless-tree-delta.json, and all nine conformance/lossless-tree/ fixtures replay.

Command / RPC message plane — lazily.command

command-plane-v1 is an additive sibling to Snapshot / Delta / CrdtSync: four evented frames (CommandSubmit / CommandCancel / CommandEvents / CommandProjection) that carry command traffic, not cell state. lazily owns the envelope; the namespace owns the IpcValue payload, which lazily never decodes.

The single hard rule: terminal authority is the causal receipt. A command is terminal only when a terminal CausalReceipt for its command_id folds in (applied, or rejected — including the cancelled / superseded / timed_out reasons). observed / accepted / started events are progress only; a transport ACK is never terminal.

from lazily import (
    CommandPolicy, CommandRpcClient, CommandSubmit, DedupePolicy,
    applied_receipt,
)
from lazily.ipc import IpcValue

class Transport:
    def __init__(self):
        self.sent = []

    def send(self, message):
        self.sent.append(message)

client = CommandRpcClient(Transport())
cmd_id = client.submit(CommandSubmit(
    command_id="cmd-1", causation_id="cmd-1", source="plugin",
    target="controller", namespace="agent-doc", name="editor_route",
    authority_generation=1, idempotency_key="doc:run", deadline_ms=0,
    policy=CommandPolicy(DedupePolicy.SAME_IDEMPOTENCY_KEY, False, True),
    payload_type="agent-doc.editor_route.v1", payload_hash="sha256:…",
    payload=IpcValue.of(b"{…}"),
    required_features=["command-plane-v1"],
))
# `call` resolves ONLY on a terminal receipt — never an ACK or `accepted`.
client.ingest_receipt(applied_receipt("rcpt-1", cmd_id, "controller", 1))
assert client.poll_call(cmd_id).kind.value == "resolved"

CommandProjection is the pure reducer (generation guards, idempotency, cancel-before-terminal-only, terminal-conflict-fails-closed, reconnect equivalence); CommandRpcClient is the derived RPC facade. The wire codec validates against lazily-spec's message-passing.json, and all eight conformance/message-passing/ fixtures replay.

Benchmarks

Wall-clock benchmarks live in BENCHMARKS.md, covering both the in-library micro-suite (reactive core, keyed reconciliation, CellMap, TextCrdt, CRDT plane) and a large spreadsheet-shaped scale suite that mirrors the lazily-rs / lazily-go scale groups (N input cells + N formula slots, formula[i] = input[i] + input[i-1]). The scale suite is measured up to a full 10,000,000-cell Google Sheets workbook (N = 5,000,000); a one-cell edit plus a 1,000-cell viewport read stays in the ~75 µs range regardless of sheet size, because the lazy pull model recomputes only the ~2 formulas that read the edited input.

make bench          # micro-suite
make bench-scale    # scale suite (default N = 1,000,000)

# or directly, with a custom size:
uv run python -m lazily.benchmarks
LAZILY_SCALE_N=5000000 uv run python -m lazily.scale_bench   # 10M-cell workbook

See BENCHMARKS.md for the full results, hardware, and honest notes on CPython's per-node overhead.

The lazily family

lazily-py is one binding in a cross-language reactive family that shares the lazily-spec wire protocol:

Binding Language Package
lazily-rs Rust lazily (crates.io)
lazily-py Python lazily (PyPI)
lazily-zig Zig GitHub
@lazily/signaling TypeScript / Cloudflare Worker npm
lazily-spec wire protocol + conformance fixtures
lazily-formal Lean 4 formal model (FSM kernel + Harel state chart)

See lazily-spec for the canonical Snapshot/Delta schemas, the IPC Lean proofs of the epoch/memo/batch invariants, and the conformance fixtures every IPC-capable binding validates against. The language-agnostic formal model — the flat FSM kernel and the full Harel state chart — lives in lazily-formal.

Development

This project uses uv. Run the local CI-equivalent suite — type-check (ty), lint (ruff), the runnable README example, and the test suite — with:

uv run poe precommit

SPEC.md is the authoritative specification for the Python primitives and the lazily-spec compliance notes.

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

lazily-0.32.0.tar.gz (267.4 kB view details)

Uploaded Source

Built Distributions

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

lazily-0.32.0-cp314-cp314-win_amd64.whl (292.3 kB view details)

Uploaded CPython 3.14Windows x86-64

lazily-0.32.0-cp314-cp314-musllinux_1_2_x86_64.whl (470.5 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

lazily-0.32.0-cp314-cp314-musllinux_1_2_aarch64.whl (473.3 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ ARM64

lazily-0.32.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (473.3 kB view details)

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

lazily-0.32.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (467.2 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

lazily-0.32.0-cp314-cp314-macosx_11_0_arm64.whl (328.3 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

lazily-0.32.0-cp314-cp314-macosx_10_15_x86_64.whl (333.5 kB view details)

Uploaded CPython 3.14macOS 10.15+ x86-64

lazily-0.32.0-cp313-cp313-win_amd64.whl (291.8 kB view details)

Uploaded CPython 3.13Windows x86-64

lazily-0.32.0-cp313-cp313-musllinux_1_2_x86_64.whl (470.2 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

lazily-0.32.0-cp313-cp313-musllinux_1_2_aarch64.whl (471.6 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

lazily-0.32.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (473.0 kB view details)

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

lazily-0.32.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (466.1 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

lazily-0.32.0-cp313-cp313-macosx_11_0_arm64.whl (328.9 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

lazily-0.32.0-cp313-cp313-macosx_10_13_x86_64.whl (334.7 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

lazily-0.32.0-cp312-cp312-win_amd64.whl (290.8 kB view details)

Uploaded CPython 3.12Windows x86-64

lazily-0.32.0-cp312-cp312-musllinux_1_2_x86_64.whl (474.5 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

lazily-0.32.0-cp312-cp312-musllinux_1_2_aarch64.whl (476.6 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

lazily-0.32.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (477.3 kB view details)

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

lazily-0.32.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (469.5 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

lazily-0.32.0-cp312-cp312-macosx_11_0_arm64.whl (329.6 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

lazily-0.32.0-cp312-cp312-macosx_10_13_x86_64.whl (336.2 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

File details

Details for the file lazily-0.32.0.tar.gz.

File metadata

  • Download URL: lazily-0.32.0.tar.gz
  • Upload date:
  • Size: 267.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for lazily-0.32.0.tar.gz
Algorithm Hash digest
SHA256 def58c6f09bbfabc8326f378d818c4be584f207a6c53883d8520ab61fcb4e813
MD5 450fd9a3f4f434aeb7a2d997de911742
BLAKE2b-256 f6689d7ea9d6fdc582d2b07bbe381ee57fb41e71171d43793d4c18ad787a4266

See more details on using hashes here.

File details

Details for the file lazily-0.32.0-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: lazily-0.32.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 292.3 kB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for lazily-0.32.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 53a76cb10f9a5c0eb6447690df7eb9dae307d99650abedb815aa2cf00ec66bc5
MD5 f2cbfdce9a1297b3053116fced805cad
BLAKE2b-256 941e5411ba5ff9c6534d329bfbb0aa71a0055751f645944bb4e4f2160966f47b

See more details on using hashes here.

File details

Details for the file lazily-0.32.0-cp314-cp314-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for lazily-0.32.0-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 f3ca6de29aaffc47d26d7d3d63bbc2474f2c2a69dc02ea3693f88972febc14cd
MD5 dcdd8004fa2b08ec288c7ebd9cec8bc4
BLAKE2b-256 af09bde9ac89ec176418c98fd35fa2a9f19c61666b7a392709673b605866b542

See more details on using hashes here.

File details

Details for the file lazily-0.32.0-cp314-cp314-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for lazily-0.32.0-cp314-cp314-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 6a3c45bb2c2496b47111637e1296066d87ff8a6bb2a9f742d130d753278ee697
MD5 c401853c3cfeb578e9fb74d560fba54f
BLAKE2b-256 45c04e074627e3695bcd71814bd8c30d276fbacd623773302f27e97d5c90ea59

See more details on using hashes here.

File details

Details for the file lazily-0.32.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for lazily-0.32.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 56b72cfabd7b035d31a255ee762ed4aa29fd042e099844cb524823e957e57ca1
MD5 9da1886fba8f477f53e37eb73e2939a6
BLAKE2b-256 88482bb251620c53bd7e722f2768156089d6360d8da487a3b33187ac06d16874

See more details on using hashes here.

File details

Details for the file lazily-0.32.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for lazily-0.32.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 c297a1fd299fc97052b566bf24ad55585433b1b15ed9a434dd1dc901a1c44bc6
MD5 5b97b5633e7924c4a8aec7ff5d5cfc81
BLAKE2b-256 f90757dcc68462089c70e11a6d4029ba4627dee5c451b08808f37f40492c27c7

See more details on using hashes here.

File details

Details for the file lazily-0.32.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for lazily-0.32.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0544b5e06ff36aa4afa1e88fba042001571abbab8d6d9d5b20ae0848d7684f4d
MD5 a3068ec4670aee003fc7ea3dbec50402
BLAKE2b-256 76697c76b4ec0a4d7dae354b38ba6690bd2aee10ba80d6c672cfaa74e4fad8db

See more details on using hashes here.

File details

Details for the file lazily-0.32.0-cp314-cp314-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for lazily-0.32.0-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 e50ed51e9d1ac858755aeb5e67aff6ef723cd39d8e675ad05d0a500ea632b7a7
MD5 103834d4bf321c0fea4da2cfa5390274
BLAKE2b-256 722ad5289d8ea047ea823f276ba982a285e0221854a9d3bdf3af06e516b57224

See more details on using hashes here.

File details

Details for the file lazily-0.32.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: lazily-0.32.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 291.8 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for lazily-0.32.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 1918da02c04ee222510b34e86e9f33fb09eb68550e865bccf83bb6349e453941
MD5 683ba5793e64675c0e2659cfc31b1cec
BLAKE2b-256 4175ef36cf48a31c1dd085016043bb68345f756f17327c953bdbc3d8a2331406

See more details on using hashes here.

File details

Details for the file lazily-0.32.0-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for lazily-0.32.0-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 bacdf25eb89ae17ef59bc1469a790d8e7c6987951ec3ec4c0a562c417aac7d7b
MD5 a9448f920b44b9351a3883b6a4326ab7
BLAKE2b-256 90b968b871c847eb1be4a5a3d9a08798a7a58cff677ad4f38caa0c724dbb5445

See more details on using hashes here.

File details

Details for the file lazily-0.32.0-cp313-cp313-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for lazily-0.32.0-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 21bdcf3e354149515e9f2de584a172fbb1833678e6eff45690132e4e392bf6c6
MD5 bee21f38f3cdf8af4d5f8736036ab909
BLAKE2b-256 07656d54779a02a4f57745133089d7fa2304acc99ba4e060f11a63daa97e8fb9

See more details on using hashes here.

File details

Details for the file lazily-0.32.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for lazily-0.32.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 60dba1a4b1be53f99a5ec1715aee40190cccfdd1269302c0a736d6f26eabf302
MD5 cfdb4a353349df0c12c2863e1e3316a5
BLAKE2b-256 9a15ebf5c1f9d38d3af051846982914f33a0745bffe44724aad3ac6e33cd5880

See more details on using hashes here.

File details

Details for the file lazily-0.32.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for lazily-0.32.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 d68c88de28b44b6f8fe84891e5da8c7356a75614dfb85d6d116d5637996d8894
MD5 0b872588df8c815092b25f99c3bae84f
BLAKE2b-256 6abb223d5f0ba592f25c68045a14b4c4d464e60de977d63b9d9a6b21c6fd596e

See more details on using hashes here.

File details

Details for the file lazily-0.32.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for lazily-0.32.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f47fc036002482581393ce6b1332a2e7cb8c3566281c588470e10f5c4dfc7479
MD5 0ceb25cba4a2dbf1076be96d8a1eb284
BLAKE2b-256 4d73d23f19e1a701d95b70d15e6e467cc3a95cfaaa1e4843d0af6831e37aaa9d

See more details on using hashes here.

File details

Details for the file lazily-0.32.0-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for lazily-0.32.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 a22bf9f38bc4f5d75b5132d6394120bda166d80ee586055c37ccec7140c12347
MD5 bd228902cb5dc12c1914673f8ebffbaa
BLAKE2b-256 c649325c6bf38c5745dd756e45d26bca8b0a76b01a05fb12b290aa0f655701eb

See more details on using hashes here.

File details

Details for the file lazily-0.32.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: lazily-0.32.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 290.8 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for lazily-0.32.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 327aa257778fbe23eaa657832507f0754f7df94ec61adb990f70f14673d05094
MD5 3bd8d1811830e82da29eb89124305609
BLAKE2b-256 9c99e249019b7c598005cefed58273433f2f1f4bf5e236f92224941e92205397

See more details on using hashes here.

File details

Details for the file lazily-0.32.0-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for lazily-0.32.0-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 478e4268a9fb5aaf26117b3052fb86fdf7fe4bb481337c2037a563acf957544c
MD5 9eb7e08314e820081901c620fbe094d2
BLAKE2b-256 3f47bab30c28364fb89ef3c862f4679c29c4c9bbf0685419a2263cb1d9f5ab99

See more details on using hashes here.

File details

Details for the file lazily-0.32.0-cp312-cp312-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for lazily-0.32.0-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 e6555b0a98761b81ff7cd7893d9ef698a6386f0c8fa42e7486f0e07196003b56
MD5 ccb9aaa3bc5032dc9007203df6e722aa
BLAKE2b-256 5f489f0a97c55a3355c13b1832722b126716fbf0035c2631c67bf4c98001d838

See more details on using hashes here.

File details

Details for the file lazily-0.32.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for lazily-0.32.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d2e3af475c77e23f76adde0175f2f57272289e06fece0c2a7d98741c826165e4
MD5 baa3cd2ad3bc445443eb459b06085a4d
BLAKE2b-256 7ae43b50fc00580b906342f19b98b1fb4f362b3abc4b677e34473e33c7f1dfd0

See more details on using hashes here.

File details

Details for the file lazily-0.32.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for lazily-0.32.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 b363edd56119e6f2a7104c3eade6a7b6f9d0206204909d173d30afda32f1e68b
MD5 c9588bf904af65b05197e6094e3f23c9
BLAKE2b-256 9e4643fe2917084e2b43ed9dbb27ae38b56c7d0fcabe8faae141c547f3564ef8

See more details on using hashes here.

File details

Details for the file lazily-0.32.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for lazily-0.32.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4fd746dfee5a37198a538d89c444483529562c1325a9519052b5567657941935
MD5 5652d0ecd0ef93365b64f26d6b422249
BLAKE2b-256 58a6e6d6f98d74615eea1c00b204d0c11bd9a68a7e9aeb5939f9adb2f526c7bd

See more details on using hashes here.

File details

Details for the file lazily-0.32.0-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for lazily-0.32.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 bfa525189455587a9ae2dbbf211660c191f6234c237e440d7180f529d0358235
MD5 209c1f9a0cc33ec00098e937b96c1a88
BLAKE2b-256 802df98419cf3371837ba1dd803381f42ee3e396b283a7285c2ecaed6d9c207a

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