Skip to main content

lazily

Lazy reactive primitives for Python — the Cell kernel (Source / Computed cells, plus Effect) 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 is the Python port of the Cell kernel (#lzcellkernel): two value kinds — Source and Computed — plus the value-less Effect sink. Cell is the value node the Source handle is bound to.

  • Source — a value written from outside (set / merge); the writable kind. Construct with source / cell (handle Source, native class Cell, slot SourceSlot / CellSlot). A MergeCell is a Source whose write folds under a non-KeepLatest policy (Cell ≡ Source(KeepLatest)).
  • Computed — a value computed from upstream, via a compute function. Construct with computed(ctx, f). Guarded by default and lazy by default.
  • Effect — a value-less sink outside the hierarchy; nothing can depend on it.

A Computed is 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 — make it eager: computed(ctx, f).eager(). Going eager attaches a scheduled puller Effect over the backing memo (eagerness is graph state — an _eager bit plus a side table — not a distinct type), so N writes inside one batch re-materialize the computed once, at the flush. Every cell is guarded — an equal recompute is suppressed by the PartialEq guard (matching TC39 Signal.Computed), so unchanged values never cascade downstream work. There is no unguarded derived mode: computed is the guarded derived constructor, and the former separate memo construction is retired.

Migration note (v2 Cell kernel, #lzcellkernel). The v1 value vocabulary is removed: Signal / signal / signal_def, formula / formula_def / FormulaCell, SourceCell / SourceCellSlot, and the .drive() / .undrive() / is_driven / is_active methods are gone. Use the v2 spelling instead — an eager Computed is computed(ctx, f).eager(); the lifecycle is .eager() / .lazy() / .is_eager(). The construction sugar cell / cell_def is deprecated in favour of source / source_def, and the derived-value slot decorator is deprecated in favour of the guarded computed (slot_def remains as the storage-sense factory). Python has no compile-time read/write split (see the design's §4): the split is a convention — a Source has set / merge, a Computed does not — not a runtime gate.

There is no dedicated Context class — a plain dict is the context, so the Rust reference's ctx.computed(f) is spelled computed(ctx, f) here. Slot is retained as the storage position that holds a node: a Slot uses itself as the dictionary key that caches its value, so any dict works as the reactive "world" (lazily-spec §5.0 "Slot-as-storage"). It is the Python analog of lazily-rs's surviving storage-sense Slot; construct it directly with Slot(callable=…) when a raw storage node is genuinely needed.

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++ C#
Reactive graph — two cell kinds (nodes SourceCell / ComputedCell; handles Source<T, M> / Computed<T>) + Effect sink + eager Computed (computed().eager()) / all cells guarded / batch
Keyed-map materialization (ComputedMap) — mint-on-access derived slots: transparency + deferral (#lzmatmode)
Thread-safe keyed map (ThreadSafeComputedMap) — Send + Sync + materialization confluence (#lzmatmode)
Async keyed map (AsyncComputedMap) — 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: SourceMap / ComputedMap) + SourceTree + reconcile
ReactiveMap Core surface — single-threaded flavor (cell-model.md § Core surface vs. binding extensions) ~
ReactiveMap Core surface — thread-safe flavor (ordering + membership reactivity) ~
ReactiveMap Core surface — async flavor (ordering + membership reactivity) ~
Atomic ordered move replayed against all three flavors (cellmap_atomic_move + cellmap_independence) ~
Memoized semantic tree (SemTree)
Stable-id alignment (manufactured identity)
Reactive queue (QueueCell SPSC/MPSC + QueueStorage adapter) Core surface — single-threaded flavor ~ ~
Reactive queue (QueueCell SPSC/MPSC + QueueStorage adapter) Core surface — thread-safe flavor (reader kinds + closure lifecycle)
Reactive queue (QueueCell SPSC/MPSC + QueueStorage adapter) Core surface — async flavor (reader kinds + eventual transparency)
Broadcast topic (TopicCell) Core surface — single-threaded flavor — independent cursors + durable replay + safe GC (#lztopiccell) ~ ~
Broadcast topic (TopicCell) Core surface — thread-safe flavor (reader kinds + closure lifecycle)
Broadcast topic (TopicCell) Core surface — async flavor (reader kinds + eventual transparency)
Competing-consumer work queue (WorkQueueCell) Core surface — single-threaded flavor — exclusive leases + ack/nack + redelivery + DLQ (#lzworkqueue) ~ ~
Competing-consumer work queue (WorkQueueCell) Core surface — thread-safe flavor (reader kinds + closure lifecycle)
Competing-consumer work queue (WorkQueueCell) Core surface — async flavor (reader kinds + eventual transparency)
Merge algebra + Source<T, M> — associative MergePolicy (KeepLatest/Sum/Max/SetUnion/RawFifo), Cell ≡ Source<KeepLatest>, read-any-cell/write-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] Storage-sense slot with dependency tracking and invalidation
slot Deprecated — use computed (guarded) or Slot(callable=…) (storage)
slot_def(resolve_ctx) Storage-sense decorator factory for a custom context resolver

Source cell

A Source cell (native class Cell) holds a mutable value. Reading cell.value inside a Computed or Effect auto-subscribes that reader; assigning cell.value = x (or cell.set(x)) compares old and new via != and, only if changed, cascades invalidation to dependents. Construct with source (the v1 cell name is deprecated).

Type Purpose
Cell[T] / Source[T] Mutable source value with subscription support
CellSlot[C_in, C_ctx, T] Slot that returns a Source cell
source Decorator: CellSlot with an identity resolver (canonical)
source_def(resolve_ctx) Decorator factory for a custom context resolver
cell / cell_def Deprecated v1 aliases of source / source_def

Eager Computed

An eager Computedcomputed(ctx, f).eager() — is the counterpart to a lazy Computed. Where a lazy cell marks itself dirty on invalidation and recomputes on the next read, an eager one 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, computed

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

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

doubled = computed(ctx, lambda c: n(c).value * 2).eager()  # eager: materialized now
print(doubled.value)   # 2

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

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

Method Purpose
computed(ctx, f) Lazy, guarded derived value bound to a context
computed(ctx, f).eager() The eager form (idempotent; returns the same handle)
.lazy() / .is_eager() Revert to lazy / query eagerness
computed_def(resolve_ctx) Decorator factory for a context-cached lazy Computed

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 / SourceMap / ComputedMap / SourceTree — keyed reactive collections (#reactivemap) with independent value/membership/order signals and atomic move. One generic ReactiveMap over a handle kind; SourceMap (input cells, adds set + eager entry) and ComputedMap (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, SourceMap, 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.

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.37.1.tar.gz (344.3 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.37.1-cp314-cp314-win_amd64.whl (341.2 kB view details)

Uploaded CPython 3.14Windows x86-64

lazily-0.37.1-cp314-cp314-musllinux_1_2_x86_64.whl (527.0 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

lazily-0.37.1-cp314-cp314-musllinux_1_2_aarch64.whl (530.0 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ ARM64

lazily-0.37.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (528.8 kB view details)

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

lazily-0.37.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (523.7 kB view details)

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

lazily-0.37.1-cp314-cp314-macosx_11_0_arm64.whl (378.4 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

lazily-0.37.1-cp314-cp314-macosx_10_15_x86_64.whl (385.6 kB view details)

Uploaded CPython 3.14macOS 10.15+ x86-64

lazily-0.37.1-cp313-cp313-win_amd64.whl (340.2 kB view details)

Uploaded CPython 3.13Windows x86-64

lazily-0.37.1-cp313-cp313-musllinux_1_2_x86_64.whl (526.2 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

lazily-0.37.1-cp313-cp313-musllinux_1_2_aarch64.whl (528.8 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

lazily-0.37.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (528.0 kB view details)

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

lazily-0.37.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (521.5 kB view details)

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

lazily-0.37.1-cp313-cp313-macosx_11_0_arm64.whl (378.7 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

lazily-0.37.1-cp313-cp313-macosx_10_13_x86_64.whl (386.6 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

lazily-0.37.1-cp312-cp312-win_amd64.whl (339.6 kB view details)

Uploaded CPython 3.12Windows x86-64

lazily-0.37.1-cp312-cp312-musllinux_1_2_x86_64.whl (529.2 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

lazily-0.37.1-cp312-cp312-musllinux_1_2_aarch64.whl (532.1 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

lazily-0.37.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (531.2 kB view details)

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

lazily-0.37.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (526.0 kB view details)

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

lazily-0.37.1-cp312-cp312-macosx_11_0_arm64.whl (379.3 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

lazily-0.37.1-cp312-cp312-macosx_10_13_x86_64.whl (387.9 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

File details

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

File metadata

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

File hashes

Hashes for lazily-0.37.1.tar.gz
Algorithm Hash digest
SHA256 da424a7a280ba614d0ccbfb1269bcabdd8252e364f5468b6485baffc3b67cc40
MD5 c4254291d44d1c1eba7199a0473e3eec
BLAKE2b-256 2bab7ad2d39d5657910509ba365890af98f971af3e0e6688d19391db28ff26f7

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lazily-0.37.1-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 341.2 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.37.1-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 fca2aec4e01cb26d83b5024d834526155a6b64c3123cc309bb7461e611fa6379
MD5 80cf83ed87a4ce94672c72cd408d115c
BLAKE2b-256 c50fd1c3b11a4b8a4dbb5800bc09311c5c551c18cb37a93bf5906737546d1ac4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.37.1-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 33d666afcc66e482fe56290f193a696f05520d21d4812ea01ee995188f17b60b
MD5 c27b1f5a160fcfba5546f0c9ff392be5
BLAKE2b-256 7c8756e1f9f3dbf8fcf521268eaa5cdb7031fa56edc32617a181f30100b50d62

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.37.1-cp314-cp314-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 71581cf753551109fc6c585581ad2f9a417c54b830b5a460241d61d5f4b22552
MD5 cea574e87bcf90bc62e75d9e121047f4
BLAKE2b-256 ae6b3d9bb3c0a28fb70f512ba4ad9ee70a3d0dd7eadb0f7a7ebc3129c90034c8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.37.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c4a5a207024c2641daf3176e1c66c7767b2edc3ed466b534524867d568aa3406
MD5 1b0a3cc5e04f9bf0c928dc841f51c828
BLAKE2b-256 10fd2262616ae945764e6f14a7c0c9d1edfc736b226bc124f8de1525e8b26290

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.37.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 6e1b9fe9dcbe4531b5f3e6f1d51f429cbc08d42a9e35eba6cfd69c67ccfa1431
MD5 2ecfc7d04c74aad2555b3ea223c5dc53
BLAKE2b-256 d975afc421603729d698ab633dfebe5da69273d9fef400f7b76e0fa4a53ac192

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.37.1-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3b745b76fef380a13eb624001cbad44148eef78fcd0062f495a6a2c325ce0c4f
MD5 63bee748e353a88a51154a74b7bd2200
BLAKE2b-256 36970821ed07a884b4b55f6f883a12596f154197a0241c2f4b8c926a4122979b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.37.1-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 18e9ea86fda597d736aa75d074eb7dbb4ad8511c84ce9d98c5d76f6f073dfc01
MD5 9fc1badb99ae0cd9f9b67efc0f12935e
BLAKE2b-256 a114897b7c7bfde0c9193de28b7c921cf4db367a1d1b8db3ff9bd7685038a1eb

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lazily-0.37.1-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 340.2 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.37.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 330ef0fc4bb616f1512a156e4fb3a134b7cf6c2d36c8ae2c747272ec3c6b4e4e
MD5 7101a813e5783f3c4f042dbc7553e7de
BLAKE2b-256 e4bb32e2dcfc75130c1084483c79646e03142926d61f8c8831721f33ef839ec9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.37.1-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 2e4981c54d5e38fa7e85d5fb3c6ad11b59ef36cdde78b671d3b176bd6db065b7
MD5 814fd521eca2dc30106189ef7374916a
BLAKE2b-256 a11865ac3ad900f3ad694ea36e91563ff12ac24f6a22d3da6ec37be686056a85

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.37.1-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 491d3d604ca302a98aa979f03ae8cc8842106a90f4f01a35ae32e05c94c5e36b
MD5 c1e48c34afc18d13a9ecb87b97fbdc39
BLAKE2b-256 fc974af2a84371a4fd738f940a694dc983f191a18ca48257b62d66ee6097b87a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.37.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1c13671eebaafb7a6c02ccc7f5c15a0da2543979d54325ec7112538530bf74f8
MD5 15dfde34215c7e739a03230534172e7c
BLAKE2b-256 f4548dd8234ed5ecd7d874ce984d305f1c4ab89938d8fba6c2b27deb716d38b4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.37.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 8eed2b51764fb770152fbd410e2dd5ccf3f03673dd02b10d215d9ad9f8153c56
MD5 f97a9b6f38e4f987cbfa444e60702023
BLAKE2b-256 ba0a29f0f1f2a06f78c138bafcdb32d3af4e4bd2bf9905ae15a11c3f5d49624e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.37.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8ddbaa9bfcb25c8ed9fac1a8623cfa7b038965054cb967554f9d51f298ed0647
MD5 6d726a0b5f9e73c2dc22bb38ed23aade
BLAKE2b-256 868465dd774e357fabfb8dbf38da51f9bc5e344c4b8f795fe4b6ef06052db2f9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.37.1-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 911fadcf76c1a88e427aa7fbd0d3324b3793c8c03dafb1cfc44f8c47d1d1abc5
MD5 512aaed640cdb0355f5c9302a18529b4
BLAKE2b-256 2f366b1bd626278ce6ea62ccacfa2c5f82280fbe60394ef3c13806aee8b9ef8b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lazily-0.37.1-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 339.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.37.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 fadf30cc6e8fcf9d44fd95935923acf11f008a612895545b4d318b8e013a2533
MD5 c202559d669e25b6e7e057f981c3649c
BLAKE2b-256 676588393efc9822af85b55f548d8768196bc7f31b8b2bb6a6146b5c4a0ecb4d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.37.1-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 e7efdace744eb7e44ee4915b905865ccf2f47bf08b19fbdfea0c5a1192572dfc
MD5 88b308e782ca52e0ef4eda6c88e06090
BLAKE2b-256 bbbc7312803dd39594a180e28e9e4b6dad908dcfb2de3ff558d778e4da604193

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.37.1-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 e9546650e622e2bbe852c71d1c8de151b0eafeafc9b1c7444283c94345334a83
MD5 fc591c6d84a6059582363fdfd977a8c6
BLAKE2b-256 0242a2644ab2121fbdaeb6a0149790bae4e04e8831dff30265b24745c8d4e08b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.37.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 0ecbbb65c61068538a9a63c1de45ceebc8ba63853d67fe51642f4cfa70029b58
MD5 50a5f818c6954aa3cadf9a91dafc1552
BLAKE2b-256 b971b77395d1b327c4518a05217cc83f350797067b13067ccc109a8f0d080383

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.37.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 6c92147dff15772f13b7194ef60b54897ffaa0ca369b98c675c5fa15edc56cf8
MD5 90a7ebb11337e4b66257c42e3a8c7ced
BLAKE2b-256 c2b96ea97638ce42bd9af7271796e6b2d8a7f1072fd82570813c58f735e9c265

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.37.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2459e94783ef97cf705f6ff1071456ac5ab28f2e8277caf07d183203bbd7ead3
MD5 487c68c4b5b633428dd5a04dc29d32d2
BLAKE2b-256 ef1d211f4ee9f2c410aa22c22a30608bc3c55278aa2773a3d5fd9acb6a6ec2cf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for lazily-0.37.1-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 657dc5312b7615b9a818fb777125b3b6597d4527b73f225c88628f44cfacdfc5
MD5 3c8a5e7aa9ea1e84e1a7e89248488881
BLAKE2b-256 9b2bd29f75286ff27eda35572b574ef05dec3b734a6bebe4d6c7f0a5d6eed597

See more details on using hashes here.

Release history Release notifications | RSS feed

0.40.0

22 files

0.39.0

22 files

0.38.0

22 files

This release

0.37.1 This release

22 files

0.37.0

22 files

0.36.0

22 files

0.35.0

22 files

0.34.0

22 files

0.33.0

22 files

0.32.0

22 files

0.31.2

22 files

0.31.1

22 files

0.31.0

8 files

0.30.1

2 files

0.30.0

2 files

0.29.0

2 files

0.27.0

2 files

0.26.0

2 files

0.25.0

2 files

0.24.0

2 files

0.23.0

2 files

0.22.0

2 files

0.21.0

2 files

0.20.0

2 files

0.19.0

2 files

0.18.0

2 files

0.17.0

2 files

0.15.0

2 files

0.14.0

2 files

0.13.0

2 files

0.12.0

2 files

0.11.1

2 files

0.11.0

2 files

0.10.2

2 files

0.10.1

2 files

0.10.0

2 files

0.9.0

2 files

0.8.0

2 files

0.7.0

2 files

0.6.0

2 files

0.5.0

2 files

0.4.1

2 files

0.4.0

2 files

0.3.0

2 files

0.2.0

2 files

0.1.1

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page