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.34.0.tar.gz (302.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.34.0-cp314-cp314-win_amd64.whl (312.0 kB view details)

Uploaded CPython 3.14Windows x86-64

lazily-0.34.0-cp314-cp314-musllinux_1_2_x86_64.whl (494.3 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

lazily-0.34.0-cp314-cp314-musllinux_1_2_aarch64.whl (497.5 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ ARM64

lazily-0.34.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (497.0 kB view details)

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

lazily-0.34.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (490.2 kB view details)

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

lazily-0.34.0-cp314-cp314-macosx_11_0_arm64.whl (348.9 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

lazily-0.34.0-cp314-cp314-macosx_10_15_x86_64.whl (355.3 kB view details)

Uploaded CPython 3.14macOS 10.15+ x86-64

lazily-0.34.0-cp313-cp313-win_amd64.whl (311.4 kB view details)

Uploaded CPython 3.13Windows x86-64

lazily-0.34.0-cp313-cp313-musllinux_1_2_x86_64.whl (493.7 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

lazily-0.34.0-cp313-cp313-musllinux_1_2_aarch64.whl (495.9 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

lazily-0.34.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (496.5 kB view details)

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

lazily-0.34.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (488.5 kB view details)

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

lazily-0.34.0-cp313-cp313-macosx_11_0_arm64.whl (349.6 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

lazily-0.34.0-cp313-cp313-macosx_10_13_x86_64.whl (356.5 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

lazily-0.34.0-cp312-cp312-win_amd64.whl (310.6 kB view details)

Uploaded CPython 3.12Windows x86-64

lazily-0.34.0-cp312-cp312-musllinux_1_2_x86_64.whl (497.5 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

lazily-0.34.0-cp312-cp312-musllinux_1_2_aarch64.whl (499.6 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

lazily-0.34.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (499.3 kB view details)

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

lazily-0.34.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (492.5 kB view details)

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

lazily-0.34.0-cp312-cp312-macosx_11_0_arm64.whl (350.1 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

lazily-0.34.0-cp312-cp312-macosx_10_13_x86_64.whl (357.7 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

File details

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

File metadata

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

File hashes

Hashes for lazily-0.34.0.tar.gz
Algorithm Hash digest
SHA256 3d32783ac76e2b8c03838f44c9a9d53cbe1dce92d7603fa68200e3a1f174c075
MD5 9695c3cc40580a38be8b1ef1102d939f
BLAKE2b-256 2dd4940a4193f8c39e5769eaaee6bdb7ef9274cf9c0e3caae9d4c095048f4c7e

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for lazily-0.34.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 b84281b4b9393ba4afcea59240dd8b17fbd70ab0adca1d36a9fc57d270360f7d
MD5 e602f8bca70e04075d4aab2ef09fde4f
BLAKE2b-256 4ae6e5c9a12b3db404e9c1f35d233295a85659d3aa60ff7d6c2dceb321197db3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.34.0-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 43ceafe15b5e1bfe8aa534667efccf9440e025eec202d395cbc7a725352e0f9f
MD5 e3398159b47d17046782208cce681fcf
BLAKE2b-256 85875b5e58c63ffaa855963dd1e182dc5e2e290c7671b8d5c2e2ee55b67f687a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.34.0-cp314-cp314-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 c9f6581950debf1d9cb2a9c0dbe742920cf087b76ca8c9748bafc60bd1f9b3c8
MD5 92244650459aa2a5faa953dfa754fca3
BLAKE2b-256 fe72a6c88069af6a15c8d188ec7015bcbcd3c1e1e8f7dc782593b5a10b4a5d4e

See more details on using hashes here.

File details

Details for the file lazily-0.34.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.34.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ff134ba42abab85e6a85ebbee73049be766a571bd771f2b5e98b708d2bc3fffd
MD5 881d146f229bf11183c10caf2db05e6a
BLAKE2b-256 26b0330286e14b117978a1fed7461eece5085dd067781e369ffbbaf216e21752

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.34.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 e2c1e26ee4ee44778ec89f6a2858b48e0bf10e91d41bdb356b52839ec7af54a9
MD5 5dc05fb319b441c9ec0f0dd72d69824b
BLAKE2b-256 c323f26f714c183c938e30ce9b0d1c366558f1524d53c80de73091ed584bbbca

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.34.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f6aaee872ce87cce89bd4e0149c0eed5ad98c25de09e576cb6ba2e5873f96e31
MD5 80c23a052d502416bbc505026e068ad8
BLAKE2b-256 f07ae1a0785ff77a7f3fc03bc5f54b41a0d630148c406adc47ffd063f5ad781a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.34.0-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 792fba7f94569ceb9079db9d21a353f368d7abdac03200a2b9f79cbc86181e34
MD5 dcfce7a884bbea7ddee9b24c18c2fd3b
BLAKE2b-256 b9cf2a445faa5a939e735620c40f5b1b59a8ac0ece0113d3769751fe56801488

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for lazily-0.34.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 e14fe1ce4cbc02380e360105aa7d83d51213e1d5799305006b3fbccf5c7ffa42
MD5 248a93e364ae4fca723730bb8ff8213d
BLAKE2b-256 9864c5323f6a4ef4e019c98b346b733b2af3abc898ed5b0eb7f9d43a3ad5f1c5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.34.0-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 92d6e1198b8c2e396b81ea3b21ec53f299ad59b40c44de11b1f0a193c1d1f0d6
MD5 c47e651e5bc05d469a7d8c5fdf67fc8b
BLAKE2b-256 f5630ff7531fc6943e9db22c4ee5657af1d130ecfe43cd659e714f78fcce5e0c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.34.0-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 9d3ceac7fe66b8496e3ae798e1c695d7b1d3b69f2e2cc85786e171e88d4752da
MD5 39882f664e7b6636766f90e429bcc1bd
BLAKE2b-256 075cb8a818f508b002dc9cce9c60666686cfbad869cbd8324cd7d9847c7e3070

See more details on using hashes here.

File details

Details for the file lazily-0.34.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.34.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d3b5d5432a3ae45f5a0f701e521f767aac35279f3033e2618ca11c869a58662a
MD5 20f121fce7f27362e081ab73260c5dc1
BLAKE2b-256 aa3a653a24ca8ff0c882fa3ded5abed14e97741ec732f16efb243e8b251624fe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.34.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 dd0d1a39a35adfdf933691f0eba933900270df5e31c180aa2482e6b316880689
MD5 245d7c6da885eb703efaba854cd8aaef
BLAKE2b-256 7c882b69ecc7057b1241cf2faa8ddc1d845e2d132fb68b4eb4a4b29846eaab38

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.34.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0d65f8a927b8121dfce1e3d3f91c2ffc5386fd0b8e18f086b43ef75d24757795
MD5 6c33824ebbbff8b1dd8ba607f596d989
BLAKE2b-256 a613f5feb0da7e32308108e36f41d39007cec4f4f5809b0799bbace867157413

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.34.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 54b5412e2060137d9f9f6830c8b83dc4ca14e22d9af4732d3641b99e1320e725
MD5 062e99f23baf6e2e9db49628b806b87a
BLAKE2b-256 bff73fb8ff3cab1ccc9e35adf380cb5202f7e0bbff7d05f81f04ac201f1864af

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for lazily-0.34.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 56931753a273b89e32ab22fe61fdb15a1f7d88b3cb64594be7618089f2d2dfb0
MD5 c00c86a46a4519ff552ba8e48ae1c64a
BLAKE2b-256 536eb704e52a0e6e9b98e717343d638ad9a267bd55ec196319eb70409c559901

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.34.0-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 132ae80883bb8d51ed045524b4253c598d5bb1be183b36802f52e3efe90b37e4
MD5 fff6e499cd81df5d331734de56012ef1
BLAKE2b-256 e20276dd3943070a6e6cf3f27f2b34e17516e764f5a70b21edbef6e4aa4bc3a3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.34.0-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 41246412291ea6fa5a35daa0865cc947a7eec3ac7ea01d9e720728f118c594f7
MD5 6be9861505af4bee3f79c03819fa4876
BLAKE2b-256 2d9a2579c98c22b0d1bf7c9a2666739581fc2f0ac74a36aaff403cfb68a7d81c

See more details on using hashes here.

File details

Details for the file lazily-0.34.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.34.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 fd75466becb1db66536bb818786bfdda2f66cef54030153175304bf71690c1d8
MD5 1a619aa293c14c0f226c9067168dd56a
BLAKE2b-256 bd1584387dc45aff936f27354c497f73975463ef10adaf847f6051688825611c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.34.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 d9348a8cd4d6e718f4bc30f4a0d78fc531ec90e5fd99fca2324aa968d0251413
MD5 694c35c516ff5b60ec34a43f196a6318
BLAKE2b-256 a5fdffe70bd4769078a69fe12f147ffb299239f85919e6713436812b50a51c52

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.34.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3b773f942c4776a5b884b7f49b52e56e695f6c42a0be558259eda6440a9d6309
MD5 e83c07586ec347947820aabb8c710d09
BLAKE2b-256 cbfae679a5fb3363530b4c8a63e32ab513357c6825acb5814b36c22449bda7b7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.34.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 5cd46e07db88ba82c245b7d5b2c4f4dca11101bd717b2f6bd8a5049932c0e06b
MD5 0c0af985c9e147b0ad71c539814d8708
BLAKE2b-256 a6d0165533468fd9efec80ab1be9807881669b3085479df8ecc29cfce5de84f6

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