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.33.0.tar.gz (269.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.33.0-cp314-cp314-win_amd64.whl (294.4 kB view details)

Uploaded CPython 3.14Windows x86-64

lazily-0.33.0-cp314-cp314-musllinux_1_2_x86_64.whl (472.6 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

lazily-0.33.0-cp314-cp314-musllinux_1_2_aarch64.whl (475.4 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ ARM64

lazily-0.33.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (475.4 kB view details)

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

lazily-0.33.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (469.3 kB view details)

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

lazily-0.33.0-cp314-cp314-macosx_11_0_arm64.whl (330.4 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

lazily-0.33.0-cp314-cp314-macosx_10_15_x86_64.whl (335.6 kB view details)

Uploaded CPython 3.14macOS 10.15+ x86-64

lazily-0.33.0-cp313-cp313-win_amd64.whl (293.9 kB view details)

Uploaded CPython 3.13Windows x86-64

lazily-0.33.0-cp313-cp313-musllinux_1_2_x86_64.whl (472.2 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

lazily-0.33.0-cp313-cp313-musllinux_1_2_aarch64.whl (473.6 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

lazily-0.33.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (475.1 kB view details)

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

lazily-0.33.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (468.2 kB view details)

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

lazily-0.33.0-cp313-cp313-macosx_11_0_arm64.whl (331.0 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

lazily-0.33.0-cp313-cp313-macosx_10_13_x86_64.whl (336.8 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

lazily-0.33.0-cp312-cp312-win_amd64.whl (292.9 kB view details)

Uploaded CPython 3.12Windows x86-64

lazily-0.33.0-cp312-cp312-musllinux_1_2_x86_64.whl (476.6 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

lazily-0.33.0-cp312-cp312-musllinux_1_2_aarch64.whl (478.7 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

lazily-0.33.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (479.3 kB view details)

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

lazily-0.33.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (471.6 kB view details)

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

lazily-0.33.0-cp312-cp312-macosx_11_0_arm64.whl (331.7 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

lazily-0.33.0-cp312-cp312-macosx_10_13_x86_64.whl (338.3 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

File details

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

File metadata

  • Download URL: lazily-0.33.0.tar.gz
  • Upload date:
  • Size: 269.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.33.0.tar.gz
Algorithm Hash digest
SHA256 1a886d7bcb448b4185e461d328223fbb118876a4e0b20e0ef0142b35e0b2b2f7
MD5 4b6e4b026c966d46334649f3f27ffeea
BLAKE2b-256 c1aa1763639044bb6f70ac3137b36ba1afacec1fd6bfc54ba3a514377a48166b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lazily-0.33.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 294.4 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.33.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 a419dceb1848cf808d0db68942c6dd2aedd1a14088bee9204f2d2c5284a8dc42
MD5 c72b346f386047a1ef79426447eb36d7
BLAKE2b-256 c04dcd12fa62902efc858d2b8d5b0119dbaa983bfb81310018b3071116633eae

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.33.0-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 8ad4708ded7bd5e1ab5d9e9aee16b663487d687ed5d2c8d3962c11e7c42b1579
MD5 28cebf27fc53919e0e3964fbd5400b4b
BLAKE2b-256 9770bc93e571f4dc5677f8e0cfb9b5c8cc82fd41a9e0c051189cfbb54143e0b2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.33.0-cp314-cp314-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 6c1c98a2d52fac4d1024a87be9ec9ef7e00cb6934f37a154cd5a6889ecd8d0e2
MD5 68c6df1d7befedff804a7e389154aa4a
BLAKE2b-256 523a49f87ffe250a0f2588624fb436d4847c8a544f225b859633bbf0d0258025

See more details on using hashes here.

File details

Details for the file lazily-0.33.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.33.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 da8b84931debd6b45f9d65572cba853e8beb06cf611f41799d40387d193c906e
MD5 b6f909b075bc98d0def0c145b94e0303
BLAKE2b-256 912b9f9a11a270f17823820d41c528024e27140307cd8cfa36a6dfdebe7d16f9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.33.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 25c0e28068abe35594a411a2083a2e1e0adaef99a4bfd1314f81cfb96e5fe2d7
MD5 db84c3988d1625dc6499e3bea13679af
BLAKE2b-256 10dd403ab66cbb212696d14e2be5bc377f5dc8654643a7201c9b1cc487d95293

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.33.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6c7bb3661703abe0dc0e9dcf80c1af4f24ba5f69d9b112c63e6711fe8ac5f2b3
MD5 dd4d16a0ac0d849c7e358c2aafbf60a6
BLAKE2b-256 169d2170e4af8f45604de7e2d8d302c87340d7e5063226c4e8ef89e85e9dc755

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.33.0-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 4f77f013574cbb36878c8f5986f1c72f899b5eef4796c381b9868e48e2621a34
MD5 e51310dd5eca43522c9a18bc2e51448b
BLAKE2b-256 9389943bada36685adbd25f0e9bf03cd71ff4f86e38b7665905a0ec6c8c334b6

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lazily-0.33.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 293.9 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.33.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 68b277def4c2db1433c7fafca07a731952e6dda5e9fc8546376d02dd20b643ae
MD5 f875b6a1d902fc0f2bc4dc427234168a
BLAKE2b-256 487a6c1cb65f9fed5ea0b18f7d96f116f26a65d177122a0e241360f120dd7f4d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.33.0-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 93ee67b4e40ff02e1880baae0d08cc032b07f46acee2c9940e631a7c8585c214
MD5 128125107f05c214a2414b87fd4284bd
BLAKE2b-256 76bff23ea9c79d8b085ad6456f7c4fdf26240bd91c4e27588b95b684067393d1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.33.0-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 02de1644afbc3475659b6246e4eca132127b60db5c516cd71c29a916664a751a
MD5 29bc3f60d7e3cb285009d0feb324d421
BLAKE2b-256 3adea8c40e80e14985fe00d9d77958b9747ded4b9b24e9846906e0aa88ff1b83

See more details on using hashes here.

File details

Details for the file lazily-0.33.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.33.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7cfe9e0b08de481b33ba2979f860a7f5bc77563279d98ff4f7aea574af35d865
MD5 4fc3c9832a61603b0ba1cace7ef2a702
BLAKE2b-256 01096c08b24b22e43b215c4c72399c5a23a02db88b5448e4320ec94a3ad52dd6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.33.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 b4bd2608c0f6957f993dd37e066a8f4e6f4381a2f5931e6b96ddf2672377f8a4
MD5 18f685bc6518c382d424f119a7607811
BLAKE2b-256 099c4021c77ac516c3f176a02130ae3a52ce7e085bf58aeb4468b6020ed339dc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.33.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c6448b97e95faa39fbea843dc895704e94e6f82aa87a7ae9beea63e07b8bf91c
MD5 6c8efcfa841541f4bb6dc4d7319025d6
BLAKE2b-256 cc69e5e75b5db5ee97097380eae79bf13b9d36bc09076e11a77de2e1f21c2c36

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.33.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 4598653d0e1437cf43a36e474bdb91f2b4ce2d0055872b64a1b2a568fb013b1d
MD5 d4eebf3f31b991f70fa7bf1848053a33
BLAKE2b-256 d9b7113bcebdca8b1dac8f3d5a42081da4d2f5984f13734b66d5aa386e696886

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lazily-0.33.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 292.9 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.33.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 0e85b74d6fea56ab3372f988569a125ac62816c8fdb4d5c5de4186a300a1cafe
MD5 caf9b4ea116ac88ccb1e3146b5c7b549
BLAKE2b-256 01de85ae15169ed0d368b482fd053226d4309cb39db47a8abc0d4358a4711adc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.33.0-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 3f830d1e53ec669e47557a7ea9240dfddf777104233c069e73a2bd89812b7070
MD5 fe7683289a56f152e702e34034f01476
BLAKE2b-256 35c8f7daf2cbf443beb9e3dc1d59d0a8a52103c2e19ff285eef0753c89b883e3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.33.0-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 43963563ae5ab33713aa017e1e1774b2552956977322d117d7e4fb42c608a8fa
MD5 c1a4b9a9d1b707246191494f5b1f4977
BLAKE2b-256 e2bf51da9691d7b670c556011749a8e04b48021dc0b71379ecf5232b621d9202

See more details on using hashes here.

File details

Details for the file lazily-0.33.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.33.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 18ce2640e6f67f1a5ebffd2b6c436fc6c553d99e46752e1f556c632e715a48df
MD5 2084c27d579c8bae1cfaf269a38ca976
BLAKE2b-256 15c84b99affdfcb799c59a06edf33f68cbd10e9bbabaf51253953dcc6dffd3b2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.33.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 e9d0463f3581eab964f81c14a5c843f117826bd01a93b6209e94d35675dd86c9
MD5 de0faaa672a4ad1f32dcc18777842ae8
BLAKE2b-256 9b092920fb99bccc1d8d299fa03976a00c735b53c6d75a88aff79f861ac92735

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.33.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e88004527f32f578c5d5d51790516514dcc79aaf490c2dbc329b1d666e755ad1
MD5 6285458ad964be5d5d81822ba840aa20
BLAKE2b-256 67bf4ebebaf78bb2891d9123dbf0e39301e21c86b941f186c474e94a6216b93b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.33.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 f43a3682716554a26c2655ae2f9bd66f61d54f784105e2b37862fa2231914eef
MD5 e882f4e543b9d0d82af7aec3bff3b12b
BLAKE2b-256 c21f3b8326ba10a03bb4eae809ceb9f1e14557cdbe1bd97f56c77e1e85b87662

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