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"])

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

# 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,...], [meta.level,...]] (columnar)

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

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

Uploaded CPython 3.14Windows x86-64

mod_dict-0.4.5-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (133.9 kB view details)

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

mod_dict-0.4.5-cp314-cp314-macosx_11_0_arm64.whl (94.3 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

mod_dict-0.4.5-cp314-cp314-macosx_10_15_x86_64.whl (100.3 kB view details)

Uploaded CPython 3.14macOS 10.15+ x86-64

mod_dict-0.4.5-cp313-cp313-win_amd64.whl (278.5 kB view details)

Uploaded CPython 3.13Windows x86-64

mod_dict-0.4.5-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (133.8 kB view details)

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

mod_dict-0.4.5-cp313-cp313-macosx_11_0_arm64.whl (94.2 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

mod_dict-0.4.5-cp313-cp313-macosx_10_13_x86_64.whl (100.3 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

mod_dict-0.4.5-cp312-cp312-win_amd64.whl (278.5 kB view details)

Uploaded CPython 3.12Windows x86-64

mod_dict-0.4.5-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (133.8 kB view details)

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

mod_dict-0.4.5-cp312-cp312-macosx_11_0_arm64.whl (94.2 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

mod_dict-0.4.5-cp312-cp312-macosx_10_13_x86_64.whl (100.3 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

mod_dict-0.4.5-cp311-cp311-win_amd64.whl (278.0 kB view details)

Uploaded CPython 3.11Windows x86-64

mod_dict-0.4.5-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (132.4 kB view details)

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

mod_dict-0.4.5-cp311-cp311-macosx_11_0_arm64.whl (93.8 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

mod_dict-0.4.5-cp311-cp311-macosx_10_9_x86_64.whl (99.2 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: mod_dict-0.4.5-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 287.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.5-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 bdb45ab4e1876a5cf792145085c5a6025163cc4818e288d45116ab35e8fc982c
MD5 67debfe1110d5219495584ba4d5f95e0
BLAKE2b-256 1f5c12af396bd047f6761eebe614dc64897cf3d81ab9eeca720861726ba1f64d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for mod_dict-0.4.5-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d5d728038b2e97daf57db3a95b3a76bd2f9514c6b7bdb9afae33a06fbb281c78
MD5 966a234e88ca0816c9db7d8ed311bb78
BLAKE2b-256 769042fc22a3ab4bf8e529d823ccc538c98a6a14c78a9c0515390a577df5435d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for mod_dict-0.4.5-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bf612c632e9d3e3e8bb24410a576cf8e79619272c17a3d34d8964cccfd256ee6
MD5 ab24ed0277c7c7585327e8282110d840
BLAKE2b-256 b8812bb08ac7bba17db1f1f85226960b9eaf6e088ab675826b29503950b5e042

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for mod_dict-0.4.5-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 93d69809a055b926954f3212c10b4f62fc8bd79e6c189b1822c7b45629bfb43f
MD5 2ea7c9de3dcde21d6e76c9f3b7b29227
BLAKE2b-256 cd5a72448bcf2c90eff298d7ff23e3adf6e72d2581a631a43e98cce076176b77

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: mod_dict-0.4.5-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 278.5 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.5-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 4ac468719750f7823b94dc29b6420ba28f23a8d1edd1b4db6aa7b1a4c2eec062
MD5 062b23c99d62f4cd1f571261f95eb76a
BLAKE2b-256 77f0b10301b6e4509cb083cfda546a0c95e45156f83112bb7bcd94a3e096c598

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for mod_dict-0.4.5-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 317f4a1106916566754891134e7293b112a91335a9c443cfb7dd3a94312150f7
MD5 b0d18c2df779d140d0b47c26aeaf491c
BLAKE2b-256 4a8defaa980c4476615d80d150b17ec12e59846b79917f929e73c4b5e32b1aac

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for mod_dict-0.4.5-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2475147be82b11d4df412a88603448f9004a1348aba016dd30a65687c7348ec3
MD5 d786871b059710208541af0e7743c65c
BLAKE2b-256 2bf9484f02cec709dc82e6eea9cac09fb0124bd08984862fc260cc1e6c8ac285

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for mod_dict-0.4.5-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 d2f27b71be875a940848ddd0aeaa00896713ff2cb6d177d1d74c0049b43cd022
MD5 efa73788ea92a160eca3a2d9e0a34aec
BLAKE2b-256 790a504cc3b325e003edf923208f65a54403cf59adf587670126a2ad7b8c2fa4

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: mod_dict-0.4.5-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 278.5 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.5-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 387b97501ba589ee126442a5b1e8f8315d4df425413edf675483502f9192ed68
MD5 4047b410ae29067a77ab92c5367484dc
BLAKE2b-256 d1bf4146f2969d9ceb92e43f85c4fe982c926e98cd4a113817b10f27545cc7df

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for mod_dict-0.4.5-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2b627f747d4bd6594118914b8c2299cb1c543cb7bb004d6f11a8d90c415a87af
MD5 e7c8c79290205ec30a14c9602d7f9e4b
BLAKE2b-256 657630918f4f589d0b3bf347b973e13dffbcc57f44aad5c65dc19166246c6b1c

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for mod_dict-0.4.5-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e242d3e7a894faca4444982f041e17850f279b9d1bf359c41dc670f8fe2aae08
MD5 4a055dcbebc9ed08439a26577524e158
BLAKE2b-256 43efe5460f3327cfdeb6c45abc919ddea0b97d1ad22c361473786a698b7fc632

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for mod_dict-0.4.5-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 e9e48d42a7defb7a4759fd74d4a531bcff928622c8aa0e29bbe97f37ba998643
MD5 bd745d4a4ea7d2eecd80c5d18c2bfbd9
BLAKE2b-256 d40109c33c84af3da1da5e977f68e5c1fc6cd2d7bc6394772559390f093db76f

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: mod_dict-0.4.5-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 278.0 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.5-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 3edd58afec8d8bd5643c29774f399f704bd9d6380041dfbefbe24be867d08196
MD5 a624eefdd10f10db689d0a2f8fa4c07e
BLAKE2b-256 e55dffc68bfefb4fad186500a27e9bf0fb5673eff57eee7d8057121cdc8e80e8

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for mod_dict-0.4.5-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e0216f995bcaa0b79acb0225e2dc933f01e57e71f979ee5f5bcda432728d6d36
MD5 9de1f5359dcbadb41819ccfbb15a5ac3
BLAKE2b-256 adff906cb4d4c18eeb71c432352848cc7229cf0d441198c0775a4e125bcefc24

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for mod_dict-0.4.5-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 274440d7f3ab9b68a83f1753a348a80870c7e31da41c4ee75a077b04af025803
MD5 577e187d46be4de67bfa63a90b2d50d5
BLAKE2b-256 541db92690783e746893a2997a1df3a148359aec5a4f3e4a2a6e9d9f2b81595d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for mod_dict-0.4.5-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 79c9c746f770196e14948ff84ee051c8687de008a545698d28b9ff250d3fdb2e
MD5 061c946848d18add1af1cbaf7c0392ee
BLAKE2b-256 503e619b421491c75fab32a3c670dfaace13c1f90e30ca5646f71b77aa44275f

See more details on using hashes here.

Provenance

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