Dict path traversal and mutation utilities
Project description
dictwalk
This library is the result started as an idea to write jq queries for a Python Dict for a reason I can't event remember anymore.
It's current form emerged because I kept asking the AI to add one more feature, then one more, then one more.
Then I asked the AI to come up with features and I said screw it add them all.
This is bored-developer + tokens to burn + scope creep in library form.
This is now just a very advanced hammer in search of a nail, could your usecase be that nail?
I know what you're thinking, this could replace those horrible nested dict functions that I have to mainain in one of my projects. Don't do it's not worth it.
Now in version 1, it's been converted to rust, so now it's much much faster and doing nothing important.
dictwalk is a small utility for traversing and mutating nested Python dict/list data using path expressions.
The implementation is now Rust-first (PyO3 extension), called from Python.
There is no pure-Python execution backend.
It supports:
- Deep reads (
get) - Existence checks (
exists) - In-place writes (
set) - In-place removals (
unset) - Predicate filtering for lists
- Wildcards (
*,**) - Transform/filter pipelines (
|$filter)
Jump To
Requirements
- Python
>=3.10 - Rust toolchain (for source builds)
Installation
From source:
pip install .
This builds the Rust extension module (dictwalk._dictwalk_rs) during install.
For local development:
uv sync
make rust-build
Quick Start
from dictwalk import dictwalk
data = {
"a": {
"users": [
{"id": 1, "name": "Ada", "active": True},
{"id": 2, "name": "Lin", "active": False},
]
}
}
# Read
names = dictwalk.get(data, "a.users[].name")
# ["Ada", "Lin"]
# Filter and map
active_names = dictwalk.get(data, "a.users[?.active==True].name[]")
# ["Ada"]
# Write
dictwalk.set(data, "a.users[?.id==2].active", True)
# Unset
dictwalk.unset(data, "a.users[?.id==1].name")
Path Syntax
Dot traversal
a.b.c
Read nested object keys.
List map
a.items[].id
Apply the next token to every item in a list.
Root-list selector variants:
.[] # root list map
.[0] # root list index
.[1:3] # root list slice
.[?.id==2] # root list predicate
$$root[] # explicit-root list map
$$root[0] # explicit-root list index
$$root[1:3] # explicit-root list slice
$$root[?.id==2] # explicit-root predicate
List index and slice
a.items[0]
a.items[-1]
a.items[1:3]
Predicates
a.items[?.id==1]
a.items[?.score>=10]
List predicates support:
==,!=,>,<,>=,<=
Predicate filters
Use registered filters on predicate values:
a.items[?.id==$even]
a.items[?.id==$gt(5)&&$lt(10)]
a.items[?.id==!$odd]
Boolean operators in predicate filters:
&&(and)||(or)!(not)- parentheses for grouping
Wildcards
a.*.id
a.**.id
*: one level**: deep descendant traversal
Output transforms
Apply filters to the final read value:
a.value|$double|$string
a.list|$max
a.list|$double[]|$max
API
dictwalk exposed from dictwalk.__init__ is the Rust extension object directly.
Python methods call into Rust for get, exists, set, unset, and run_filter_function.
The package ships PEP 561 type information (py.typed) for Python type checkers.
dictwalk.get(data, path, default=None, strict=False)
- Returns resolved value.
- If
strict=False: resolution failures returndefault. - If
strict=True: raisesDictWalkResolutionError.
Special root token support in read paths:
$$root.x
$$root[]
$$root[0]
$$root[1:3]
$$root[?.id==2]
Root selectors must be the first token in a path. Mid-path usage is invalid:
a.b.$$root.x # raises DictWalkParseError
a.$$root[0] # raises DictWalkParseError
dictwalk.exists(data, path, strict=False) -> bool
- Returns
Trueif path resolves, elseFalse. - If
strict=True, raisesDictWalkResolutionErroron resolution failures.
dictwalk.set(data, path, value, *, strict=False, create_missing=True, create_filter_match=True, overwrite_incompatible=True) -> dict
Mutates and returns the same data object.
value can be:
- A direct value (
42,"x",{"k": 1}) - A filter string (
"$double","$add(2)|$string") - A root reference expression:
$$root$$root.some.path$$root.some.path|$filter
Notes:
- Bare
$$rootis valid invalue, not in writepath. - Bracketed root selectors are valid in write paths:
$$root[],$$root[0],$$root[1:3],$$root[?.id==2]. - With
strict=True, parent path must already resolve.
dictwalk.unset(data, path, *, strict=False) -> dict
Removes targeted values in-place and returns the same object.
At terminal paths this can:
- Remove dict keys
- Remove list indexes/slices
- Remove list items matching a filter
Examples
This section contains practical examples for:
dictwalk.getdictwalk.setdictwalk.unset
from dictwalk import dictwalk
Shared Sample Data
data = {
"a": {
"b": {"c": 1},
"users": [
{"id": 1, "name": "Ada", "active": True, "score": 10},
{"id": 2, "name": "Lin", "active": False, "score": 20},
{"id": 3, "name": "Mia", "active": True, "score": 30},
],
"groups": {
"g1": {"u1": {"id": 1, "debug": True}},
"g2": {"nested": {"u2": {"id": 2, "debug": False}}},
},
},
"x": 2,
"profile": {"name": "Dict Walk", "tags": ["py", "paths", "json"]},
}
get Examples
Basic traversal:
dictwalk.get(data, "a.b.c")
# 1
Root object:
dictwalk.get(data, ".")
# full data object
Root token:
dictwalk.get(data, "$$root.x")
# 2
Root-list selectors:
root_list = [{"id": 1, "name": "Ada"}, {"id": 2, "name": "Lin"}, {"id": 3, "name": "Mia"}]
dictwalk.get(root_list, ".[]")
# [{"id": 1, "name": "Ada"}, {"id": 2, "name": "Lin"}, {"id": 3, "name": "Mia"}]
dictwalk.get(root_list, "$$root[0].name")
# "Ada"
dictwalk.get(root_list, ".[1:3].id[]")
# [2, 3]
dictwalk.get(root_list, "$$root[?.id>1].name[]")
# ["Lin", "Mia"]
Invalid mid-path root token:
dictwalk.get(data, "a.b.$$root.x")
# raises DictWalkParseError
Missing path with default:
dictwalk.get(data, "a.b.missing", default="n/a")
# "n/a"
Strict mode:
dictwalk.get(data, "a.b.missing", strict=True)
# raises DictWalkResolutionError
List map:
dictwalk.get(data, "a.users[].name")
# ["Ada", "Lin", "Mia"]
List index and negative index:
dictwalk.get(data, "a.users[0].name")
# "Ada"
dictwalk.get(data, "a.users[-1].name")
# "Mia"
List slice:
dictwalk.get(data, "a.users[1:3].name[]")
# ["Lin", "Mia"]
Predicate filters:
dictwalk.get(data, "a.users[?.id==2].name[]")
# ["Lin"]
dictwalk.get(data, "a.users[?.score>10].name[]")
# ["Lin", "Mia"]
dictwalk.get(data, "a.users[?.score<=20].name[]")
# ["Ada", "Lin"]
Predicate path filters:
dictwalk.get(data, "a.users[?.id==$even].name[]")
# ["Lin"]
dictwalk.get(data, "a.users[?.id==$gt(1)&&$lt(3)].name[]")
# ["Lin"]
dictwalk.get(data, "a.users[?.id==!$odd].name[]")
# ["Lin"]
Predicate root (?.):
dictwalk.get({"items": ["hi", "hello", "yo"]}, "items[?.|$len>2]")
# ["hello"]
Nested predicates:
dictwalk.get(
{"a": [{"b": [{"c": 1}, {"c": 2}], "d": 10}, {"b": [{"c": 3}], "d": 20}]},
"a[?.b[?.c==2]].d",
)
# [10]
Wildcards:
dictwalk.get(data, "a.groups.*.id")
# [1]
dictwalk.get(data, "a.groups.**.id")
# [1, 2]
Output transforms:
dictwalk.get(data, "a.b.c|$double")
# 2
dictwalk.get(data, "a.b.c|$double|$string")
# "2"
dictwalk.get(data, "a.users[].score|$sum")
# 60
dictwalk.get(data, "profile.tags|$join(',')")
# "py,paths,json"
set Examples
All set operations mutate and return the same data object.
Basic nested write:
obj = {}
dictwalk.set(obj, "a.b.c", 5)
# {"a": {"b": {"c": 5}}}
Create list path via map:
obj = {}
dictwalk.set(obj, "a.items[].value", 1)
# {"a": {"items": [{"value": 1}]}}
Update list values with map:
obj = {"a": {"nums": [1, 2, 3]}}
dictwalk.set(obj, "a.nums[]", 9)
# {"a": {"nums": [9, 9, 9]}}
Transform existing values:
obj = {"a": {"nums": [1, 2, 3]}}
dictwalk.set(obj, "a.nums[]", "$double")
# {"a": {"nums": [2, 4, 6]}}
dictwalk.set(obj, "a.nums[]", "$add(1)|$string")
# {"a": {"nums": ["3", "5", "7"]}}
Filtered write:
obj = {"a": {"users": [{"id": 1, "active": False}, {"id": 2, "active": False}]}}
dictwalk.set(obj, "a.users[?.id==2].active", True)
# {"a": {"users": [{"id": 1, "active": False}, {"id": 2, "active": True}]}}
Operator filter write:
obj = {"a": {"users": [{"id": 1, "score": 10}, {"id": 2, "score": 20}, {"id": 3, "score": 30}]}}
dictwalk.set(obj, "a.users[?.id>1].score", 0)
# {"a": {"users": [{"id": 1, "score": 10}, {"id": 2, "score": 0}, {"id": 3, "score": 0}]}}
Index and slice write:
obj = {"a": {"nums": [10, 20, 30, 40]}}
dictwalk.set(obj, "a.nums[1]", 99)
# {"a": {"nums": [10, 99, 30, 40]}}
dictwalk.set(obj, "a.nums[1:3]", 0)
# {"a": {"nums": [10, 0, 0, 40]}}
Wildcard write:
obj = {"a": {"u1": {"enabled": False}, "u2": {"enabled": False}}}
dictwalk.set(obj, "a.*.enabled", True)
# {"a": {"u1": {"enabled": True}, "u2": {"enabled": True}}}
Deep wildcard write:
obj = {"a": {"g1": {"u1": {"enabled": False}}, "g2": {"nested": {"u2": {"enabled": False}}}}}
dictwalk.set(obj, "a.**.enabled", True)
# {"a": {"g1": {"u1": {"enabled": True}}, "g2": {"nested": {"u2": {"enabled": True}}}}}
$$root value expressions:
obj = {"a": {"items": [{"v": 0}, {"v": 0}]}, "source": 9}
dictwalk.set(obj, "a.items[].v", "$$root.source")
# {"a": {"items": [{"v": 9}, {"v": 9}]}, "source": 9}
dictwalk.set(obj, "a.items[].v", "$$root.source|$double")
# {"a": {"items": [{"v": 18}, {"v": 18}]}, "source": 9}
Root-list writes:
root_list = [{"v": 1}, {"v": 2}, {"v": 3}]
dictwalk.set(root_list, ".[].v", 9)
# [{"v": 9}, {"v": 9}, {"v": 9}]
dictwalk.set(root_list, "$$root[1:3].v", 5)
# [{"v": 9}, {"v": 5}, {"v": 5}]
Strict write:
obj = {}
dictwalk.set(obj, "a.b.c", 1, strict=True)
# raises DictWalkResolutionError
Write options:
obj = {}
dictwalk.set(obj, "a.b.c", 1, create_missing=False)
# {}
obj = {"a": {"users": [{"id": "1", "c": 10}]}}
dictwalk.set(obj, "a.users[?.id==3].c", 99, create_filter_match=False)
# unchanged
obj = {"a": 1}
dictwalk.set(obj, "a.b", 2, overwrite_incompatible=False)
# {"a": 1}
unset Examples
All unset operations mutate and return the same data object.
Remove nested key:
obj = {"a": {"b": {"c": 1, "d": 2}}}
dictwalk.unset(obj, "a.b.c")
# {"a": {"b": {"d": 2}}}
Remove mapped key from all list items:
obj = {"a": {"users": [{"id": 1, "name": "Ada"}, {"id": 2, "name": "Lin"}]}}
dictwalk.unset(obj, "a.users[].name")
# {"a": {"users": [{"id": 1}, {"id": 2}]}}
Remove field from filtered matches:
obj = {"a": {"users": [{"id": 1, "score": 10}, {"id": 2, "score": 20}]}}
dictwalk.unset(obj, "a.users[?.id==2].score")
# {"a": {"users": [{"id": 1, "score": 10}, {"id": 2}]}}
Remove items at terminal filtered path:
obj = {"a": {"users": [{"id": 1}, {"id": 2}, {"id": 3}]}}
dictwalk.unset(obj, "a.users[?.id>1]")
# {"a": {"users": [{"id": 1}]}}
In-place list filtering with unset:
obj = {"a": {"b": [1, 2, 3, 4, 5]}}
# Keep even values (remove non-matches)
dictwalk.unset(obj, "a.b[?.|$even==False]")
# {"a": {"b": [2, 4]}}
# Remove even values
dictwalk.unset(obj, "a.b[?.|$even==True]")
# {"a": {"b": [1, 3, 5]}}
General predicate style for in-place filtering:
- Keep condition
P: unsetP == False - Remove condition
P: unsetP == True - For scalar-list current-item predicates, use
?.|$filter...on the left side.
Remove list index and slice:
obj = {"a": {"nums": [10, 20, 30, 40]}}
dictwalk.unset(obj, "a.nums[1]")
# {"a": {"nums": [10, 30, 40]}}
dictwalk.unset(obj, "a.nums[1:3]")
# {"a": {"nums": [10]}}
Root-list unsets:
root_list = [{"id": 1, "v": 10}, {"id": 2, "v": 20}, {"id": 3, "v": 30}]
dictwalk.unset(root_list, ".[?.id>1].v")
# [{"id": 1, "v": 10}, {"id": 2}, {"id": 3}]
dictwalk.unset(root_list, "$$root[?.id==3]")
# [{"id": 1, "v": 10}, {"id": 2}]
Unset with slice + nested field:
obj = {"a": {"users": [{"id": 1, "debug": True}, {"id": 2, "debug": False}, {"id": 3, "debug": True}]}}
dictwalk.unset(obj, "a.users[1:3].debug")
# {"a": {"users": [{"id": 1, "debug": True}, {"id": 2}, {"id": 3}]}}
Wildcard unset:
obj = {"a": {"u1": {"debug": True, "id": 1}, "u2": {"debug": False, "id": 2}}}
dictwalk.unset(obj, "a.*.debug")
# {"a": {"u1": {"id": 1}, "u2": {"id": 2}}}
Deep wildcard unset:
obj = {"a": {"g1": {"u1": {"debug": True, "id": 1}}, "g2": {"nested": {"u2": {"debug": False, "id": 2}}}}}
dictwalk.unset(obj, "a.**.debug")
# {"a": {"g1": {"u1": {"id": 1}}, "g2": {"nested": {"u2": {"id": 2}}}}}
Strict unset:
obj = {"a": {"b": {}}}
dictwalk.unset(obj, "a.b.c", strict=True)
# raises DictWalkResolutionError
Filter Functions
This section documents the built-in path filters available in dictwalk.
Use filters in:
- Output transforms:
a.b.c|$double|$string - Predicate expressions:
a.items[?.id==$even] - Write transforms:
dictwalk.set(data, "a.items[]", "$inc")
Usage notes:
- Syntax:
$nameor$name(arg1, arg2, ...) - Pipe multiple filters with
| - Add
[]to map over list values in transform context (example:$double[]) - Predicate boolean composition supports
&&,||,!, and parentheses
Numeric:
$inc: add 1$dec: subtract 1$double: multiply by 2$square: multiply by itself$add(amount): add amount$sub(amount): subtract amount$mul(factor): multiply by factor$div(divisor): divide (returnsNonewhen divisor is 0)$idiv(divisor): integer divide/floor divide (returnsNonewhen divisor is 0)$mod(divisor): modulo (returnsNonewhen divisor is 0)$neg: negate value$pow(exponent): raise value to exponent$rpow(base): raise base to value$sqrt: square root (returnsNonefor negative input)$root(degree): nth root (returnsNonefor invalid input)$round(ndigits=0): round value$floor: floor$ceil: ceil$abs: absolute value$clamp(min_value, max_value): clamp to bounds$sign: -1, 0, or 1$log(base=e): logarithm (returnsNonefor invalid input)$exp: exponential$pct(percent): percent of value (x * percent/100)
Comparison/predicates:
$even: true if even int$odd: true if odd int$gt(threshold): greater than threshold$lt(threshold): less than threshold$gte(threshold): greater than or equal$lte(threshold): less than or equal$between(min_value, max_value): inclusive range check$contains(value): membership forstr/list/tuple/set/dict$in(values): check if current value is in provided container$type_is(name): type-name comparison (case-insensitive)$is_empty:Noneor zero-length container$non_empty: inverse of$is_empty
Conversion:
$string:str(x)$int:int(x)$float:float(x)$decimal:Decimal(x)$bool: truthy conversion with string handling ("true","1","yes", etc.)$quote: wrap in double quotes
String:
$lower: lowercase string$upper: uppercase string$title: title case$strip(chars=None): strip chars$replace(old, new): replace substring$regex_replace(pattern, repl): regex substitution viare.sub$split(sep=None): split into list$join(sep): join list-like values$startswith(prefix): startswith check$endswith(suffix): endswith check$matches(pattern): regex search check
Collections:
$len: length$keys: dict keys in iteration order (Nonefor non-dict)$values: dict values in iteration order (Nonefor non-dict)$items: dict entries as{"key": ..., "value": ...}in iteration order (Nonefor non-dict)$max: max for list/tuple, otherwise passthrough$min: min for list/tuple, otherwise passthrough$unique: deduplicate list while preserving order$sort_by(path, reverse=False): stable sort list/tuple items by item-relative path, unresolved items sort last$unique_by(path): keep first item per resolved item-relative path, unresolved items are retained$index_by(path): build dict keyed by resolved item-relative path, later items win on duplicates, unresolved items are skipped$group_by(path): build dict of key -> list keyed by resolved item-relative path, unresolved items are skipped$reverse: reverse list/tuple order$chunk(size): split list/tuple into chunks ofsize(returnsNoneforsize <= 0)$flatten: flatten one level of nested list/tuple items into a new list$flatten_deep: recursively flatten nested list/tuple items into a new list$sorted(reverse=False): sort list/tuple$first: first item for list/tuple$last: last item for list/tuple$pick(*keys): keep only selected dict keys$unpick(*keys): remove selected dict keys
Statistics:
$sum: sum for list/tuple, otherwise passthrough$avg: average for list/tuple, otherwise passthrough$pctile(p): percentile of list/tuple (pin0..100, linear interpolation)$median: median of list/tuple$q1: 25th percentile of list/tuple$q3: 75th percentile of list/tuple$iqr: interquartile range (q3 - q1)$mode: most frequent value in list/tuple (ties pick first encountered)$stdev: population standard deviation of list/tuple
Null/fallback:
$const(value): always returnvalue(ignores current input)$default(value): fallback when current value isNone$coalesce(*values): first non-Noneamong current value and provided values$compact: remove onlyNoneelements from list/tuple, otherwise passthrough
Date/time:
$to_datetime(fmt=None): parse datetime$strftime(fmt): format datetime-like values withstrftime$timestamp: convert datetime-like to unix timestamp$age_seconds: seconds from datetime to now$before(dt): datetime comparison$after(dt): datetime comparison
Serialization:
$from_json: parse JSON from string input (Nonefor non-string or invalid JSON)$to_json: serialize value withjson.dumps
Filter usage examples:
from dictwalk import dictwalk
data = {"a": {"scores": [10, 20, 30], "name": " ada ", "created": "2024-01-01T00:00:00Z"}}
dictwalk.get(data, "a.scores|$sum")
# 60
dictwalk.get({"a": {"nested": [[1, 2], [3], 4]}}, "a.nested|$flatten")
# [1, 2, 3, 4]
dictwalk.get({"a": {"nested": [[1, [2, [3]]], 4]}}, "a.nested|$flatten_deep")
# [1, 2, 3, 4]
dictwalk.get({"a": {"items": [1, 2, 3, 4, 5]}}, "a.items|$chunk(2)")
# [[1, 2], [3, 4], [5]]
dictwalk.get({"a": {"meta": {"x": 1, "y": 2}}}, "a.meta|$items")
# [{"key": "x", "value": 1}, {"key": "y", "value": 2}]
dictwalk.get({"a": {"users": [{"id": 2}, {"id": 1}, {"name": "missing"}]}}, "a.users|$sort_by('id')")
# [{"id": 1}, {"id": 2}, {"name": "missing"}]
dictwalk.get(data, "a.name|$strip|$title")
# "Ada"
dictwalk.get({"a": "b"}, ".|$const('literal value')")
# "literal value"
dictwalk.get({"a": {"code": "item 123"}}, "a.code|$regex_replace('\\\\d+', '#')")
# "item #"
dictwalk.get({"a": {"raw": '{"id": 1}'}}, "a.raw|$from_json")
# {"id": 1}
dictwalk.get({"a": {"created": "2024-01-01T00:00:00Z"}}, "a.created|$to_datetime|$strftime('%Y-%m-%d')")
# "2024-01-01"
dictwalk.get(data, "a.created|$to_datetime|$timestamp")
# 1704067200.0
dictwalk.get({"a": {"users": [{"id": 1}, {"id": 2}]}}, "a.users[?.id==$even].id[]")
# [2]
Errors
From dictwalk.errors:
DictWalkError(base)DictWalkParseErrorDictWalkOperatorErrorDictWalkResolutionError
Use strict=True when you want explicit failures instead of fallback defaults.
Development
Run tests:
make test
Build Rust extension:
make rust-build
Run lint/type/dependency checks:
make lint
make type
make deptry
Run everything:
make ci
Direct tox usage:
uv run tox -e py310,py311,py312,py313,py314,lint,type,deptry
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dictwalk-2.5.0.tar.gz.
File metadata
- Download URL: dictwalk-2.5.0.tar.gz
- Upload date:
- Size: 32.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.12 {"installer":{"name":"uv","version":"0.10.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bca9f07c2adefcfc613d52fdb19d0b6c6dfdc39bff4f12fdaa457db9aac7bcf1
|
|
| MD5 |
dbbb452384ac2d6752af021e78d397b8
|
|
| BLAKE2b-256 |
e6a0e0c14ecd913b1086bf18e8e3088056e313387f33780ead44c5f98e2a48bf
|
File details
Details for the file dictwalk-2.5.0-cp310-abi3-win_amd64.whl.
File metadata
- Download URL: dictwalk-2.5.0-cp310-abi3-win_amd64.whl
- Upload date:
- Size: 843.0 kB
- Tags: CPython 3.10+, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.12 {"installer":{"name":"uv","version":"0.10.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a0ddc271c32ecfb031d5909395c6bf56a0e91b320677e443e71d95cd23f061d8
|
|
| MD5 |
1a5bf42dc1910ba7cf397f0c489972ae
|
|
| BLAKE2b-256 |
3b8bc6a67029d3b810cdb8fbbbe06c63cc57cb332b66988cc24dc4b85c113155
|
File details
Details for the file dictwalk-2.5.0-cp310-abi3-win32.whl.
File metadata
- Download URL: dictwalk-2.5.0-cp310-abi3-win32.whl
- Upload date:
- Size: 752.3 kB
- Tags: CPython 3.10+, Windows x86
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.12 {"installer":{"name":"uv","version":"0.10.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cda8f14999a58ba79ff0487822dad930415641f00c49d6b72d9cd5740f590235
|
|
| MD5 |
0bc1368b5b8ca33e111d13ce5bc447d7
|
|
| BLAKE2b-256 |
e0727fca88a05a7c5215051c7347310194634fabfdd346e83a217b77531cf6bd
|
File details
Details for the file dictwalk-2.5.0-cp310-abi3-manylinux_2_28_x86_64.whl.
File metadata
- Download URL: dictwalk-2.5.0-cp310-abi3-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 1.0 MB
- Tags: CPython 3.10+, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.12 {"installer":{"name":"uv","version":"0.10.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4993d2848148e128cccae4a0662b3f51b8555b2f3d0293d18687ac6e6028e3ec
|
|
| MD5 |
60a45f985e7346d2df20481694f4bbc1
|
|
| BLAKE2b-256 |
d9546b189c783ad453195962fbc3b9a9f4115fa7ed438fc5495d3d5b353d0023
|
File details
Details for the file dictwalk-2.5.0-cp310-abi3-manylinux_2_28_aarch64.whl.
File metadata
- Download URL: dictwalk-2.5.0-cp310-abi3-manylinux_2_28_aarch64.whl
- Upload date:
- Size: 1.0 MB
- Tags: CPython 3.10+, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.12 {"installer":{"name":"uv","version":"0.10.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
42826be24e4ef2da1a6371ab065be88e76696e780e6c6ad0e1cb580e3384d752
|
|
| MD5 |
ae7758935533804b8b1074cf7784cc5a
|
|
| BLAKE2b-256 |
030d2eaadf5e78e59a35c0a46948f33eb2d0ab937469c96670ccf2faba59fecc
|
File details
Details for the file dictwalk-2.5.0-cp310-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: dictwalk-2.5.0-cp310-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 889.3 kB
- Tags: CPython 3.10+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.12 {"installer":{"name":"uv","version":"0.10.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
26bb44437a943eb205c55c51a20de79d6cf02fc131b36d77258ca5d121d8b40f
|
|
| MD5 |
c0d767da6666f5ee9b96a75e22fb6405
|
|
| BLAKE2b-256 |
f5987161d00d5533e4d32a944bf6981e1fa27eb2884a85257f174ae177594d13
|