Skip to main content

Nested dictionary with indexed field queries, merge and serialization

Project description

mod_dict

A Python extension (C++) that stores nested dictionaries by reference and provides indexed filtering, sorting, grouping and merging — without converting to a DataFrame or a database.

import mod_dict as md

mn = md.ModDict()
mn["alice"] = {"age": 30, "score": 9.5, "active": True,
               "meta": {"level": 5, "details": {"rank": 42}}}

# Field access via chaining on stored PyObject* — no copy
age  = mn["alice"]["age"]                        # 30
rank = mn["alice"]["meta"]["details"]["rank"]    # 42
mn["alice"]["age"] = 31                          # update in-place

# Indexed filter / sort / group — auto-builds index on first call
adults = mn.filter("age").gte(18)
active = mn.filter("active").eq(True)
rows   = mn.sort_by("age")                       # → [row, row, ...]
keys   = mn.sort_by("age", returns="parent_keys")# → [key, key, ...]
ages   = mn.sort_by("age", returns="values")     # → [18, 25, 30, ...]
groups = mn.group_by("age")                      # → {value: ModDict, ...}
slim   = mn.select(["age", "score"])             # → new ModDict
cols   = mn.select(["age", "score"], returns="values")  # → [[age,...], [score,...]] (columnar)

# Dot-notation paths in sort / group / select
mn.sort_by("meta.details.rank")
mn.group_by("meta.level")
mn.select(["meta.details.rank", "score"])

# Links between rows — declare, traverse, JOIN-in-WHERE, ON DELETE
mn.link("orders.?.customer_id", "customers.?")
mn.follow("orders.?.customer_id")                # → ModDict of resolved customers
mn.filter("orders.?.customer_id->name").eq("Alice")  # JOIN in WHERE, chainable ("->name->city")

# Update from another collection
mn.update(other)                                 # bulk insert (like dict.update)
mn.update(other, "*", "*")                       # key-to-key merge (only updates existing)
mn.update(other, "?", "?")                       # key-to-key: also inserts new keys from other
mn.update(other, "user_id", "id")               # field-to-field
mn.update(other, "*.geo.lat", "*.geo.lat")      # deep field only

# Aliases — transparent second key for the same row
mn.alias("alice", "al")
mn["al"]["age"] = 32          # same row — mn["alice"]["age"] == 32
mn["al"] = {"age": 33}        # replaces row via alias
del mn["al"]                  # removes both alias and original
print(mn.aliases())           # {"al": "alice"}

# Build from a list of rows or any Mapping
mn3 = md.ModDict.from_rows(users, key="id")      # {r["id"]: r for r in users}
mn4 = md.ModDict(other_mn)                       # copy from ModDict
mn5 = md.ModDict(OrderedDict(...))               # any Mapping accepted

# Deep copy (7.8× faster than deepcopy)
backup = mn.copy()

# Index access by insertion order
mn.at(0)    # first value
mn.at(-1)   # last value

# Binary serialization (full Python type set — date, bytes, Decimal, Path, …)
data = mn.serialize()
mn2  = md.ModDict(); mn2.deserialize(data)

# Custom type converters — applied at insert time
md.register_converter(Temperature, lambda t: t.celsius)

Architecture

Rows are stored as PyObject* references — the same dict object the caller passed in, with Py_INCREF. No deep copy.

mn["alice"] = row_dict          # Py_INCREF(row_dict), store pointer
mn["alice"]["age"]              # outer hash → PyObject* → PyDict_GetItemString

On top of the outer hash table, a FieldIndex per field powers O(1) equality and O(log n) range queries. Indices are built automatically on the first filter() / sort_by() / group_by() call and reused after.

When it fits

  • Collection of records with a fixed (or semi-fixed) schema.
  • You need indexed filter, sort, group, or field-level merge without pandas/SQL.
  • Write once, query many times.
  • In-process cache shared across asyncio coroutines — zero-copy, no GC pressure on reads.

When it does not fit

  • Truly write-heavy, latency-sensitive workloads — mn[k] = row is slightly slower than dict (refcount + hash).
  • You need concurrent writes from multiple threads.
  • Schema is fully dynamic with no repeating field names.

API at a glance

# Write
mn[key] = value                          # scalar or nested dict
mn[key]["field"] = value                 # update field in-place
del mn[key]

# Read
mn[key]                                  # full row — O(1), returns stored dict ref
mn[key]["field"]                         # field via Python chaining
mn.get(key, default)
mn.pop(key)                              # remove and return value
mn.pop(key, default)                     # return default if not found

# Membership / size
key in mn
len(mn)                                  # aliases are not counted

# Iteration — aliases are hidden
for key in mn: ...
mn.keys() / mn.values() / mn.items()

# Filter (auto-builds index on first call, reused after)
mn.filter("age").eq(18)                          # age == 18
mn.filter("age").ne(18)                          # age != 18
mn.filter("age").lt(18)                          # age <  18
mn.filter("age").lte(18)                         # age <= 18
mn.filter("age").gt(18)                          # age >  18
mn.filter("age").gte(18)                         # age >= 18
mn.filter("age").between(18, 30)                 # 18 <= age <= 30
mn.filter("city").in_(["NY", "LA"])              # city in [...]
mn.filter("orders.?.status").eq("shipped")       # ? skips one key, checks value
mn.filter("?").eq("orders")                      # terminal ?: outer rows that HAVE key "orders"
mn.filter("g1.?.status").eq("shipped")           # anchor: first segment scopes scan to key "g1"
mn.filter("region.?.?.status").eq("Active")      # one ? per level — chain for deeper nesting

# non-terminal wildcard results are PRUNED: only matching inner keys survive,
# so chained filters behave as AND (not OR)
mn.filter("a.?.age").eq(30).filter("a.?.name").eq("alice")

# returns parameter: collect inner-level results without rebuilding a new ModDict
mn.filter("age").gte(18, returns="rows_here")                    # → [row, ...]
mn.filter("age").gte(18, returns="values", value_field="name")   # → [name, ...]

# "->" — JOIN a declared link() mid-path, chainable, index-accelerated on .eq()
mn.filter("orders.?.customer_id->name").eq("Alice")
mn.filter("orders.?.customer_id->company_id->name").eq("Acme")   # 2 hops

# Sort / select / group — support dot-notation paths
mn.sort_by("age", reverse=False, returns="rows")        # default → [row, ...]
mn.sort_by("age", returns="parent_keys")                # → [key, ...]
mn.sort_by("age", inplace=True)                         # reorders mn in-place, returns None
mn.sort_by("meta.details.rank", returns="values")       # → [val, ...]


mn.select(["age", "name"])                              # → new ModDict, keyed by each path's last segment
mn.select({"user_age": "age"})                          # explicit labels — also disambiguates collisions
mn.select(["age", "meta.level"], returns="values")      # → [[age,...], [meta.level,...]] (columnar)
mn.select(["orders.?.customer_id->name"])                # wildcard/"->" fields too — {order_pk: {"name": ...}}

mn.group_by("active")                                   # → {value: ModDict, ...}
mn.group_by("meta.level")

# Links between rows (self-references allowed) — see "Links between rows" below
mn.link("orders.?.customer_id", "customers.?", on_delete="restrict")  # restrict|cascade|set_null
mn.follow("orders.?.customer_id")                        # → ModDict of resolved target rows

# Aliases
mn.alias(key, alias)                     # create alias (1 per key)
mn.aliases()                             # → {alias: original_key, ...}
del mn[alias]                            # removes alias and original

# Update from another collection
mn.update(other)                                      # bulk insert
mn.update(other, from_path, to_path, conflict="keep_right")

# Deep copy (7.8× faster than copy.deepcopy)
mn.copy()                                        # → new ModDict, rows deep-copied

# Index access by insertion order (O(1), supports negative indices)
mn.at(0)                                         # first inserted key's value
mn.at(-1)                                        # last inserted key's value

# Build from a list of dicts
md.ModDict.from_rows(rows, key="id")             # {r["id"]: r for r in rows}
md.ModDict.from_row(row)                         # normalize Mapping → plain dict

# Serialize
mn.serialize() / mn.deserialize(data)          # data → self, returned for chaining
mn.to_dict()                                   # → plain dict (bypasses RowProxy)
md.dumps(obj) / md.loads(data)                 # serialize any object; ModDict round-trips as ModDict

# Index management (optional — auto-index handles most cases)
mn.create_index("field") / mn.drop_index("field") / mn.has_index("field")

Path syntax for update and filter

Token Meaning
* scan_key — match by outer key (update: only updates existing keys)
? pass_key — wildcard one nesting level (update: also inserts new keys; filter non-terminal: skips any key; filter terminal: checks if KEY exists at this level)
key anchor (filter) — first segment matched against outer keys to scope the scan
mn.update(updates, "*", "*")                         # join by outer key (existing only)
mn.update(updates, "?", "?")                         # join + insert new keys from other
mn.update(prices, "*.meta.score", "*.meta.score")   # update one deep field

mn.filter("orders.?.status").eq("shipped")           # ? skips any order id key
mn.filter("?").eq("orders")                          # terminal ?: outer row HAS key "orders"
mn.filter("g1.?.status").eq("shipped")               # anchor "g1": scan scoped to one row
mn.filter("region.?.?.status").eq("Active")          # one ? per level, chain for deeper nesting
mn.filter("age").gte(18, returns="rows_here")        # → flat list of matching inner dicts
mn.filter("age").gte(18, returns="values", value_field="name")  # → list of field values

Non-terminal wildcard matches are pruned — the result only keeps the inner keys that actually matched (not the whole row), so chaining .filter(...) calls on wildcard paths behaves as AND, not OR. eq() on wildcard paths (any depth) and terminal ? reconstruct directly from the index with no rescan; ne() and range ops (lt/gt/...) on wildcard paths fall back to a full scan every call — there's no index shortcut for those yet.

Space is an alias for . in path strings

Every path-accepting API (filter, sort_by, group_by, select, update, create_index, ...) treats whitespace as a literal alias for ."meta.level" and "meta level" are identical. No collapsing: "meta level" (extra spaces) is equivalent to "meta...level" (extra dots) — both produce empty segments in the middle, matching nothing. Same strictness for both separators.

mn.filter("meta level").eq(5)          # same as mn.filter("meta.level").eq(5)
mn.filter("g1 ? user_id").eq(1)        # same as mn.filter("g1.?.user_id").eq(1)

A field name that itself contains a literal . or space can't be written as a string path — pass a tuple/list instead, where each element is taken as one exact segment with no splitting at all:

mn.filter(("first name",)).eq("alice")   # field literally named "first name"
mn.filter(("a.b",)).eq(1)                # field literally named "a.b"

Also new: mn.to_dict() returns a plain dict (bypasses RowProxy — useful for libraries like Pydantic that require an actual dict), and module-level md.dumps(obj) / md.loads(data) serialize any supported object, not just a whole ModDict — a ModDict round-trips back as a ModDict, everything else as itself. No implicit ModDictdict conversion; call mn.to_dict() first if that's what you want serialized.

Links between rows

Declare a foreign-key-style relationship between rows in the same ModDict — including self-references, e.g. an employee hierarchy via manager_id:

mn = md.ModDict({
    "orders":    {1: {"customer_id": 100}, 2: {"customer_id": 200}},
    "customers": {100: {"name": "Alice"},  200: {"name": "Bob"}},
})
mn.link("orders.?.customer_id", "customers.?")            # pk-based
mn.link("orders.?.customer_id", "customers.?.email")      # or match by a non-pk field

mn.follow("orders.?.customer_id")                         # → ModDict of resolved customers
mn.follow("orders.?.customer_id", keys=[1])                # only for order 1
mn.follow("orders.?.customer_id", values=[100, 200])        # resolve ids directly, no table scan

# ON DELETE — SQL-style, self-reference-safe (a cycle breaks itself on the first delete)
mn.link("employees.?.manager_id", "employees.?", on_delete="cascade")
del mn["employees"][1]                                      # cascades to every direct/indirect report

# JOIN in WHERE — "->" resolves a declared link mid-path, chainable across hops
mn.filter("orders.?.customer_id->name").eq("Alice")         # orders whose customer's name is "Alice"
mn.filter("orders.?.customer_id->company_id->name").eq("Acme")  # 2 hops
mn.select(["orders.?.customer_id->name"])                   # {order_pk: {"name": ...}, ...}

on_delete is "restrict" (default — refuses if still referenced), "cascade" (deletes referencing rows too, recursively), or "set_null" (clears the reference field on referencing rows). A None/missing FK is never a dangling-reference error — same as a nullable SQL foreign key. Both link() (at declaration, against existing data) and every later write to the source table validate references immediately — not just at delete time.

follow()'s keys= composes multi-hop walks of unknown depth (e.g. walking a hierarchy to its root) via an explicit Python loop:

managers      = mn.follow("employees.?.manager_id")                       # 1 hop
skip_managers = mn.follow("employees.?.manager_id", keys=managers.keys()) # 2 hops

->, by contrast, is for a statically known number of hops in one expression and works inside filter()/select() directly — .eq() is index-accelerated (no table scan); .ne()/.lt()/.between()/.in_()/... fall back to a scan of the anchor table. returns="rows_here"/"values" aren't supported on a -> path (ambiguous once two tables are involved).

Custom type converters

Converters are applied at insert time — values are converted before storage, so they survive serialize(). MRO is walked: a converter for a base class also applies to subclasses.

md.register_converter(MyType, lambda obj: obj.to_dict())
mn["key"] = {"value": MyType(...)}   # → stored as dict, serializable

Built-in converters for shapely geometry (WKB) and geoalchemy2 (WKBElement) activate automatically when the library is installed.

Full type stubs with docstrings are in src/mod_dict.pyi — visible in IDE on hover and via help().

Installation

pip install mod_dict

Requires Python ≥ 3.11. Pre-built wheels for Windows / Linux / macOS. To build from source: pip wheel . (requires CMake ≥ 3.15 and a C++17 compiler).

Asyncio

ModDict is safe for concurrent reads in a single-threaded event loop. Rows are stored as PyObject* references — no copy between coroutines, no GC pressure during reads.

cache = md.ModDict()

async def handler(request):
    row = cache[request.user_id]
    return Response(row["meta"]["details"]["rank"])

async def startup():
    for key, row in data:
        cache[key] = row

See BENCHMARK.md for detailed numbers.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

mod_dict-0.5.0-cp314-cp314-win_amd64.whl (312.2 kB view details)

Uploaded CPython 3.14Windows x86-64

mod_dict-0.5.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (162.6 kB view details)

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

mod_dict-0.5.0-cp314-cp314-macosx_11_0_arm64.whl (113.9 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

mod_dict-0.5.0-cp314-cp314-macosx_10_15_x86_64.whl (124.3 kB view details)

Uploaded CPython 3.14macOS 10.15+ x86-64

mod_dict-0.5.0-cp313-cp313-win_amd64.whl (303.1 kB view details)

Uploaded CPython 3.13Windows x86-64

mod_dict-0.5.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (162.5 kB view details)

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

mod_dict-0.5.0-cp313-cp313-macosx_11_0_arm64.whl (113.7 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

mod_dict-0.5.0-cp313-cp313-macosx_10_13_x86_64.whl (124.3 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

mod_dict-0.5.0-cp312-cp312-win_amd64.whl (303.1 kB view details)

Uploaded CPython 3.12Windows x86-64

mod_dict-0.5.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (162.5 kB view details)

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

mod_dict-0.5.0-cp312-cp312-macosx_11_0_arm64.whl (113.7 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

mod_dict-0.5.0-cp312-cp312-macosx_10_13_x86_64.whl (124.3 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

mod_dict-0.5.0-cp311-cp311-win_amd64.whl (302.5 kB view details)

Uploaded CPython 3.11Windows x86-64

mod_dict-0.5.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (161.6 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

mod_dict-0.5.0-cp311-cp311-macosx_11_0_arm64.whl (113.2 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

mod_dict-0.5.0-cp311-cp311-macosx_10_9_x86_64.whl (123.1 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

File details

Details for the file mod_dict-0.5.0-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: mod_dict-0.5.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 312.2 kB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for mod_dict-0.5.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 9d284fd0f614aa870ed6695f56e95ac83f42985a17b1f5e9f20cdac1cf0874ec
MD5 d10a8cf4dd0eb681a60a9fd6fe316a72
BLAKE2b-256 c4732ac5cb6b3139946495b08f5d79b85d62c75ab559ff0de8fd61fcdd12b351

See more details on using hashes here.

Provenance

The following attestation bundles were made for mod_dict-0.5.0-cp314-cp314-win_amd64.whl:

Publisher: build.yml on grey-pre-server/mod_dict

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mod_dict-0.5.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for mod_dict-0.5.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 47c463920b29f939ef853eb208f8609a4bb3dfc835a78c0786bde80ee15d8184
MD5 70e371e72e171640935dd61262ee9b42
BLAKE2b-256 f8bc296ede8c3298114e23eae5e8b5d4095be43708dbf0a0486945b78661af00

See more details on using hashes here.

Provenance

The following attestation bundles were made for mod_dict-0.5.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl:

Publisher: build.yml on grey-pre-server/mod_dict

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mod_dict-0.5.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for mod_dict-0.5.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a69b177c9aa71673446f04e160ab2ca0caaefa92075db934a7858f4544911fe9
MD5 db7399ac7cd83549b8d51cd12e5917e3
BLAKE2b-256 6ac15e75f63bcefe20b6234f36f064e5610b7ab0d752ecc7b529992040d9d6e5

See more details on using hashes here.

Provenance

The following attestation bundles were made for mod_dict-0.5.0-cp314-cp314-macosx_11_0_arm64.whl:

Publisher: build.yml on grey-pre-server/mod_dict

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mod_dict-0.5.0-cp314-cp314-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for mod_dict-0.5.0-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 b79278ea05cca564a3acc0d90ece93e0980668a43289da627817907ab2469ae6
MD5 43238db2ca9cc7d242d9a8269d958b06
BLAKE2b-256 958c502455e762fb8e492d2fc7a8b21e21257f6deaf128a5bf85d1fe353106b9

See more details on using hashes here.

Provenance

The following attestation bundles were made for mod_dict-0.5.0-cp314-cp314-macosx_10_15_x86_64.whl:

Publisher: build.yml on grey-pre-server/mod_dict

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mod_dict-0.5.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: mod_dict-0.5.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 303.1 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for mod_dict-0.5.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 745613b9d027e1d0d8e060d551ccf9c99a058ea061105008af21bf493824fb6b
MD5 5036545b3cb8ccb8d7c5c0c60a2dcbde
BLAKE2b-256 7ce8790716578d53721d587d3adebceef659a0370147470f4a241316c0d9ba51

See more details on using hashes here.

Provenance

The following attestation bundles were made for mod_dict-0.5.0-cp313-cp313-win_amd64.whl:

Publisher: build.yml on grey-pre-server/mod_dict

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mod_dict-0.5.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for mod_dict-0.5.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 fbe7afb342414eee3ab2cddf97deceec3c4c67abf6ac08a15551582ed3c4499e
MD5 096959060072332e8bccd32e4490dc55
BLAKE2b-256 8feeb16c0384ee203003c36a861c175bcc694fdfab7249c62fa24c6f9f5c511e

See more details on using hashes here.

Provenance

The following attestation bundles were made for mod_dict-0.5.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl:

Publisher: build.yml on grey-pre-server/mod_dict

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mod_dict-0.5.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for mod_dict-0.5.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e9559e896a164419de203e8aa3657dd5ac761da3c82ed2a31425007f4ea182ee
MD5 985c368d056b40ddd2e2a815122a1511
BLAKE2b-256 eb8b6ddf55cc2c9ade8f3e01216cba479c043340edb20fbeaf110d01154bb667

See more details on using hashes here.

Provenance

The following attestation bundles were made for mod_dict-0.5.0-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: build.yml on grey-pre-server/mod_dict

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mod_dict-0.5.0-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for mod_dict-0.5.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 2c3711ec9593d8f173fbfafef3614c38a02b6c047ddfe81a005f610364a9f2d3
MD5 6a75080ab11df419fab41e46a5d712bc
BLAKE2b-256 d7b68d9fc7ff7d4841f8b6d285d0f650406a939d1997b325a5f678cf38b3b72c

See more details on using hashes here.

Provenance

The following attestation bundles were made for mod_dict-0.5.0-cp313-cp313-macosx_10_13_x86_64.whl:

Publisher: build.yml on grey-pre-server/mod_dict

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mod_dict-0.5.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: mod_dict-0.5.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 303.1 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for mod_dict-0.5.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 6b2d6ad60851a7eb167447d5edf147155a4fc94919e0661a7c7aeab0ba72afec
MD5 1909b37773db3206208e92c808ce5075
BLAKE2b-256 53bd9beddfd10d1171abd5ea7c19ca156981c02512a1a92fb72aae05edaf8132

See more details on using hashes here.

Provenance

The following attestation bundles were made for mod_dict-0.5.0-cp312-cp312-win_amd64.whl:

Publisher: build.yml on grey-pre-server/mod_dict

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mod_dict-0.5.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for mod_dict-0.5.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6946e09bdf7bd5aaac1da0dd046b0526f8f7658ea83ec30b2568ca7d1c155cd4
MD5 af51b94a5de7927dbb6d4c41423c29dd
BLAKE2b-256 113c64e8caee1f25458ffcd25f98333135e1462364c1641bdfe688f7c60a55a5

See more details on using hashes here.

Provenance

The following attestation bundles were made for mod_dict-0.5.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl:

Publisher: build.yml on grey-pre-server/mod_dict

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mod_dict-0.5.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for mod_dict-0.5.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 92147201bdec25840b20f2d8048c2d178f49b237e26c0e4330b3e181db84b9b2
MD5 ab334423f415243d7ebedb11d8fbc479
BLAKE2b-256 11e56e9bb127cfd36254f6f787d24f17cdfcab9b89b0ee1939ea365484718710

See more details on using hashes here.

Provenance

The following attestation bundles were made for mod_dict-0.5.0-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: build.yml on grey-pre-server/mod_dict

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mod_dict-0.5.0-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for mod_dict-0.5.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 b1ec5a870c4abe5b1dfac2786cd13e8f9fdd1e1c0783baddf4db256dea4a59cb
MD5 23a35237d2d32fdf43971c7dd7ccd21e
BLAKE2b-256 ce233d7f32748a507aecb5452cf414dfd6fda9576132742b295f73f9746a4fe6

See more details on using hashes here.

Provenance

The following attestation bundles were made for mod_dict-0.5.0-cp312-cp312-macosx_10_13_x86_64.whl:

Publisher: build.yml on grey-pre-server/mod_dict

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mod_dict-0.5.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: mod_dict-0.5.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 302.5 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for mod_dict-0.5.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 c79b4a0adbceac250b12cc7e888bdff6e90984d534988b9d7689f69c1b83b930
MD5 817f89271c6185b3f81b5f8f59d9551f
BLAKE2b-256 b8732887ad1041e136db8c574641a2034a19c7d6f3c1ddde5eb6e5dd0ecc5b3a

See more details on using hashes here.

Provenance

The following attestation bundles were made for mod_dict-0.5.0-cp311-cp311-win_amd64.whl:

Publisher: build.yml on grey-pre-server/mod_dict

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mod_dict-0.5.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for mod_dict-0.5.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1998ee91229769bbf1f58421914b2ce30a1e3d430a0c358d512d41d5fe2e05f8
MD5 660f9c9c09322c38c537622b6a9da724
BLAKE2b-256 57bdef43fd9f4f1079db686f1b72ae4348012822b3380e9016fa1ed5b6b1496b

See more details on using hashes here.

Provenance

The following attestation bundles were made for mod_dict-0.5.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl:

Publisher: build.yml on grey-pre-server/mod_dict

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mod_dict-0.5.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for mod_dict-0.5.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 db6181616dce07c13d017957b37968f3f50f61a6530902a9c2ec2b58872670aa
MD5 95bbba923ee3c44d9c578c1f5cb69895
BLAKE2b-256 a51bdf5061e69b02ab38340c3461914fa85bd2c8dc7ac4cce6ee0d04ee80d6ef

See more details on using hashes here.

Provenance

The following attestation bundles were made for mod_dict-0.5.0-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: build.yml on grey-pre-server/mod_dict

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mod_dict-0.5.0-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for mod_dict-0.5.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 3e70b17891cc536d8d49f649379b1b00eeee9bb6982be7e09798de6b1dd79439
MD5 16bcabce3c3422b0b9646585094014f2
BLAKE2b-256 651b6a22e73c11ea713ea9eddc42e0bc762c91cb93a8db3e42cae6dd9a10cab4

See more details on using hashes here.

Provenance

The following attestation bundles were made for mod_dict-0.5.0-cp311-cp311-macosx_10_9_x86_64.whl:

Publisher: build.yml on grey-pre-server/mod_dict

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page