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

Uploaded CPython 3.14Windows x86-64

mod_dict-0.4.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (119.8 kB view details)

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

mod_dict-0.4.0-cp314-cp314-macosx_11_0_arm64.whl (82.8 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

mod_dict-0.4.0-cp314-cp314-macosx_10_15_x86_64.whl (88.0 kB view details)

Uploaded CPython 3.14macOS 10.15+ x86-64

mod_dict-0.4.0-cp313-cp313-win_amd64.whl (267.3 kB view details)

Uploaded CPython 3.13Windows x86-64

mod_dict-0.4.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (119.9 kB view details)

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

mod_dict-0.4.0-cp313-cp313-macosx_11_0_arm64.whl (82.7 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

mod_dict-0.4.0-cp313-cp313-macosx_10_13_x86_64.whl (87.9 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

mod_dict-0.4.0-cp312-cp312-win_amd64.whl (267.2 kB view details)

Uploaded CPython 3.12Windows x86-64

mod_dict-0.4.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (119.9 kB view details)

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

mod_dict-0.4.0-cp312-cp312-macosx_11_0_arm64.whl (82.7 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

mod_dict-0.4.0-cp312-cp312-macosx_10_13_x86_64.whl (87.9 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

mod_dict-0.4.0-cp311-cp311-win_amd64.whl (266.7 kB view details)

Uploaded CPython 3.11Windows x86-64

mod_dict-0.4.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (118.9 kB view details)

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

mod_dict-0.4.0-cp311-cp311-macosx_11_0_arm64.whl (82.3 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

mod_dict-0.4.0-cp311-cp311-macosx_10_9_x86_64.whl (87.0 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: mod_dict-0.4.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 275.7 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.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 8618bbf90255821f71d28fec1cbd69f256b54e664fadb1f9f93eb72448c91e7d
MD5 9001347dc838bf195e66db2ceb26bb80
BLAKE2b-256 b8ad180702ca882b65bf240ea6e0a155657bcff837b4594378fc290020f85714

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for mod_dict-0.4.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f536f7bd88f232165bdd55cb0ca1e861227539513c0b0442bdd47d82f07ab8c2
MD5 991308af79aad46458809138d9f19d73
BLAKE2b-256 2138a4a721b33be467401970b82fc9406e4674237fb16f796f83f456bcd6546b

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for mod_dict-0.4.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 aeaa8ffaf590c6c252d7d0a4fcf81483625c366071e317164b8c3a498e37ae54
MD5 91f0b5731cf45a66e2792cd82464115f
BLAKE2b-256 62c03ee8351efbbac54fc5d2fb0f9b6ce600899b258013725550d93ae805b5fd

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for mod_dict-0.4.0-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 97af36d5277f1f444cade2084df84841e8b4c09036ad222ee53efc939ae11f11
MD5 c19ad2fcef05fdbd45d0d2710f48cce8
BLAKE2b-256 68307adc50c9cb650e8a39043b27b3b9c2c3dd2a9ff0e964c02a2496447f8959

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: mod_dict-0.4.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 267.3 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.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 e80d74f24430894067ddb83f46e7523e2d52ce9e3a52c8c0b269389354985f75
MD5 aafdfff180ff6ee9029a47a3491be5c9
BLAKE2b-256 af697a3f39b8fb8fe8a1a11a9ac4320dad5f2f9282219d1da9b1b4f80eb03c68

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for mod_dict-0.4.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 11e8f0cf0506935f26d72520af7da9cb5d306c361e1589fda3ef24ecd9977cde
MD5 3b083928fd209cf807bd3339baf1bd57
BLAKE2b-256 36eb2959e49a728b7e603dc5b07f80274e38aea45094306e46759e87194c67ed

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for mod_dict-0.4.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8f15dd09aeb3272e12dcd60897f229a9c34c143160caaa0b065b90e886f10f88
MD5 7cc7dd3c0747bff33ce1407b0b14f282
BLAKE2b-256 2cb8fd80afdfa26ca8d4d547135deb5b22990f6d6cf8227315085bfa22c81d4b

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for mod_dict-0.4.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 2495a6cc75fd9fbef61e51e3302369cf145c3d26771d084dec9434238ddddd13
MD5 f6df7e1087514a945d0c14fd84e137fe
BLAKE2b-256 ffec3b07c14459e2c4cfbb8ae204a51926c8749e23dc81e543fd0a6715d4c990

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: mod_dict-0.4.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 267.2 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.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 870d4eb8766c76df8b9cf64680d69fb9138e8789c296bbfb980bb558b11ca052
MD5 395df97a9c21ab59fa2bc5a7b066ec51
BLAKE2b-256 ef3467313c778cbbcbe75f177367b03d3b55cec4a4aea4402f85bb4bc3d4f4e4

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for mod_dict-0.4.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9b8ca2e4551450b2b09224784dc5dda244acd1b8502dc45a73d34138d0e5c306
MD5 5b59b58ee0228a21486a551160e7c471
BLAKE2b-256 36e2b40814c9281559fb7cd648ac2bf6742fe0d314afe65a2498723cf93d1d5e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for mod_dict-0.4.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b0608f12023a76c3c9fc167f424a245b92bab79413dd7fab5eb956581fb5bc77
MD5 1b3c9aee7616ae39f7482d05e698cc1a
BLAKE2b-256 5e9a043a92024c2f7de9c697f3d1443c390fd500c5236213c079748c31ecb012

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for mod_dict-0.4.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 ca6152c3d3ef51f966abc3b12b7872b31db11d4ee28d0a8d7fd35e492f66dcbd
MD5 fa64a9e721059f2ba41115db2c37431a
BLAKE2b-256 f9bb9734820bcedfeb4a3498eca5b8c7ecb3d957513bdc35195ebd5cd2dbf5f8

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: mod_dict-0.4.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 266.7 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.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 967f1b1dcc17a008c71d3e216474c05968b896e9609c54d6928fdc825ac27f3c
MD5 ca10b77ec5c5dcc5dc5dca84a1b16603
BLAKE2b-256 84615ff5592d7a1a660f4816602945caec1201ca84cfe470ed049015e979468c

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for mod_dict-0.4.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5f98ca6e751a94921b7c0638ffbb71da14425b67ff1f85fb8e270f93c9f74e3c
MD5 ea61c88fcd870f2a8aaaefb63a52a376
BLAKE2b-256 ecb977fe959fdcacc8e00e89d8d603834f8145573d28863d978e20088092f2d0

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for mod_dict-0.4.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7e144bed58be0bcff9755b34a04db45a10a1c2c588bf4c3a912bcb07331824c2
MD5 93b676ee8ef4c9843727f135405c064f
BLAKE2b-256 00e4f4448dc5882d2809bc3b367066011e2a023bd68cb275030db9224bef7832

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for mod_dict-0.4.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 0713e1ecf5c056eb22ae7b3cdce0306a9ab18666ec1711df1a954f82658ac257
MD5 f87205b137c9c3938fd2751c0e130e04
BLAKE2b-256 9ed9eeb786be8b851a6c3a3837cd019c20c6f677c2049aafe275d94b44c082c4

See more details on using hashes here.

Provenance

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