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
rows   = mn.select(["age", "score"], returns="values")  # → [{"age":..}, ..]

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

# 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"

# 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, ...]

# 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
mn.select(["age", "meta.level"], returns="values")      # → [{"age":..}, ...]

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

# 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)

# 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("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

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.4.1-cp314-cp314-win_amd64.whl (276.0 kB view details)

Uploaded CPython 3.14Windows x86-64

mod_dict-0.4.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (119.6 kB view details)

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

mod_dict-0.4.1-cp314-cp314-macosx_11_0_arm64.whl (83.0 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

mod_dict-0.4.1-cp314-cp314-macosx_10_15_x86_64.whl (88.2 kB view details)

Uploaded CPython 3.14macOS 10.15+ x86-64

mod_dict-0.4.1-cp313-cp313-win_amd64.whl (267.7 kB view details)

Uploaded CPython 3.13Windows x86-64

mod_dict-0.4.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (119.6 kB view details)

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

mod_dict-0.4.1-cp313-cp313-macosx_11_0_arm64.whl (82.9 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

mod_dict-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl (88.2 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

mod_dict-0.4.1-cp312-cp312-win_amd64.whl (267.7 kB view details)

Uploaded CPython 3.12Windows x86-64

mod_dict-0.4.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (119.6 kB view details)

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

mod_dict-0.4.1-cp312-cp312-macosx_11_0_arm64.whl (82.9 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

mod_dict-0.4.1-cp312-cp312-macosx_10_13_x86_64.whl (88.2 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

mod_dict-0.4.1-cp311-cp311-win_amd64.whl (267.1 kB view details)

Uploaded CPython 3.11Windows x86-64

mod_dict-0.4.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (118.3 kB view details)

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

mod_dict-0.4.1-cp311-cp311-macosx_11_0_arm64.whl (82.4 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

mod_dict-0.4.1-cp311-cp311-macosx_10_9_x86_64.whl (87.2 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: mod_dict-0.4.1-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 276.0 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.4.1-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 fe512c0495cc60b3175c4bbb4ac84570f6b7054cd7e5c943d7e750b73a75a989
MD5 8bd88d8ac9178dba43ce3fb175305663
BLAKE2b-256 4fc58512e411e188be60e768e55e09f52937542ef4251dc030e66ba472685b7e

See more details on using hashes here.

Provenance

The following attestation bundles were made for mod_dict-0.4.1-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.4.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for mod_dict-0.4.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 067ba8e19907d5b36a160f39b25ddc997ef2cb0aa74d895987280ba7635c7f7f
MD5 598c34d14ac2a39931db3a543e0e7766
BLAKE2b-256 980eeb17250678f325bcbc6f30c94a93de4de5a28b4c68d99f3a9ffd9aacb861

See more details on using hashes here.

Provenance

The following attestation bundles were made for mod_dict-0.4.1-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.4.1-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for mod_dict-0.4.1-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a1c9d9dc9396b226d36188a95b40ecbb19e640237df58bd8c4a4c0dc3ee95d25
MD5 9b02ec5b5dee41a695052f9b90e3bbd5
BLAKE2b-256 a2ea4161bea614a993e640c504ddde034d636df2d0d4e3f11cd2f08d6d1d6ad6

See more details on using hashes here.

Provenance

The following attestation bundles were made for mod_dict-0.4.1-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.4.1-cp314-cp314-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for mod_dict-0.4.1-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 23c857caed41859d2bd4b996d0a073d48d93abd6e5b7326cbb361415a26265f6
MD5 7abd073f0047e8762872efa6a51ada95
BLAKE2b-256 fc1f9f434612bdd522d5f509f1c04423cbd4a495e1b1bf88286f4240b3b28b24

See more details on using hashes here.

Provenance

The following attestation bundles were made for mod_dict-0.4.1-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.4.1-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: mod_dict-0.4.1-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 267.7 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.4.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 6590bfb5cfd30cd8b8ccd91d1d1738bf19637933f730261b1bc3740a70eac005
MD5 8c2fc2a0c7046b21059873e522a13208
BLAKE2b-256 11203ddf6cdb8a45b27706394e6f2776e934439a8a9265448e53929aeeed3f0a

See more details on using hashes here.

Provenance

The following attestation bundles were made for mod_dict-0.4.1-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.4.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for mod_dict-0.4.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 132a70f41e67bf2967e69286d8b3a89f8657a9bde1f0eb4ef3e441813252b755
MD5 778674b2f1eabc0c6997ab04a46bec6f
BLAKE2b-256 2c52325e1481988d291b936ad79a9efbd3a5072d83313ed46642df17d536073b

See more details on using hashes here.

Provenance

The following attestation bundles were made for mod_dict-0.4.1-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.4.1-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for mod_dict-0.4.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 15ef2b3a4a5f2614deae87cf5b8fda369dbf76eb7f01f50bcae4dbbbdb493228
MD5 b361aeee0e385d2e4e1d8c673979cac0
BLAKE2b-256 e8027ab72946ef3df73d369afd523861ce535db4a7c9591c1d9b6d098ce2bfff

See more details on using hashes here.

Provenance

The following attestation bundles were made for mod_dict-0.4.1-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.4.1-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for mod_dict-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 10edc4b00b5b7a0da6170cbcc2afa86a4f69d7a5d76eafac11dd223902fa884f
MD5 fccca5e4fc867d1d7e0ca26cd63bc825
BLAKE2b-256 8790c6ffb9439f9a5b045588267974042d59273dcabc8a7100dc634f4b52bd28

See more details on using hashes here.

Provenance

The following attestation bundles were made for mod_dict-0.4.1-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.4.1-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: mod_dict-0.4.1-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 267.7 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.4.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 374c0da1eb093cecc4eb8f02664bd81c45e8b367b25b7138dcb89170e4ab322f
MD5 43c06819f4957cc7dca6ddc90beac0fa
BLAKE2b-256 787da7df431890e987a61616857f35abe31b41be2dcf9d353823fea22f391a95

See more details on using hashes here.

Provenance

The following attestation bundles were made for mod_dict-0.4.1-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.4.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for mod_dict-0.4.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1e5fc64da2ba34654b015885c7094a6fdec184e6da82793c02afe8ef9b30386a
MD5 3d39505ac32f4715b2c1c3b89cbcafb2
BLAKE2b-256 0c39db737e889fb3eadbb87f50940adb283a4756a716fbb06880c9997e2d91c2

See more details on using hashes here.

Provenance

The following attestation bundles were made for mod_dict-0.4.1-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.4.1-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for mod_dict-0.4.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8460e262a59ea264f057804462c25dee62df39509b3b9be0224a4b6cd3b0ba74
MD5 6e1a985eac329fc142d46d8f2036ff46
BLAKE2b-256 529f57cec12999669e04a6323831c5baa86878effd9ecc1a65ae440274434ee5

See more details on using hashes here.

Provenance

The following attestation bundles were made for mod_dict-0.4.1-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.4.1-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for mod_dict-0.4.1-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 0005cd068cedbb2b8412f6cf5f8514a84b9978f43d21b7e0eb65ae12439fc335
MD5 4238804baca8ec41570bc169f51727a4
BLAKE2b-256 7f6aac5230340dd81c72488b94c87b1d9609c0a0ee2b1c7ebb6dacdea01673ed

See more details on using hashes here.

Provenance

The following attestation bundles were made for mod_dict-0.4.1-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.4.1-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: mod_dict-0.4.1-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 267.1 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.4.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 41d27e8bdf4ed8c6d81550d46c9b10f3f835488c824d867ad57fdc8b29ad62db
MD5 80a990cbf3dfc17b9d4a2a399b48010c
BLAKE2b-256 b82711a425e48a3f7709479ae5bc643895f583ca7eb4ed012c3a4a6ccf4ff273

See more details on using hashes here.

Provenance

The following attestation bundles were made for mod_dict-0.4.1-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.4.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for mod_dict-0.4.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b13c2847bf462cf34e32adcf3ba84fa9cb4a4461e46095819919d8e6d9767afd
MD5 d26c0a560f5536d8e9c1f507cad60740
BLAKE2b-256 ddb2ec9c44f54bbdc32157f3797d46ec1f2b3931506a0d2fcdf510e676a85a79

See more details on using hashes here.

Provenance

The following attestation bundles were made for mod_dict-0.4.1-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.4.1-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for mod_dict-0.4.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 87f6a70ed9469f002432164fc492917c11d7d7eb5fe2daa60e1e5001f98aa43a
MD5 00ae5c975ed10036f9c22009061e1bad
BLAKE2b-256 6a26a7777dee7a7fb0cb977b87b46e90caf858c315c5f898735551193f8aa9b6

See more details on using hashes here.

Provenance

The following attestation bundles were made for mod_dict-0.4.1-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.4.1-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for mod_dict-0.4.1-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 da523c3cc7573bba98bec1179837a332a779aba60641e08c46ab00e2aca982c8
MD5 cd51b8673c5fb79bbc931a2a7e53db0d
BLAKE2b-256 af64cdb8ab8e86c01210625e8c3cac384041d71a90598b567c154b0c7fa1042c

See more details on using hashes here.

Provenance

The following attestation bundles were made for mod_dict-0.4.1-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