Skip to main content

A python based library inspired by nested-property module in javascript

Project description

Nested Property Library for Python

A lightweight Python library for accessing, modifying, and manipulating nested dictionaries and lists using dot-separated paths. Inspired by JavaScript libraries like nested-property, with support for multi-character list index prefixes.


Features

  • Get nested values: get(obj, path)
  • Set nested values: set(obj, path, value)
  • Delete nested values: delete(obj, path)
  • Check existence: has(obj, path)
  • Push values to nested lists: push(obj, path, value)
  • Pull values from nested lists: pull(obj, path, value=None, index=None)
  • Supports list indices with optional prefixes, e.g., "$0" or "idx_0"
  • Default behavior treats numeric keys as list indices automatically (index_prefix=None)

Installation

pip install nested-property

Usage

import the functions

from nested_property import get, set, delete, has, push, pull

Note that you can also import unset which is an alias for delete

Basic usage

data = {"a": {"b": {"c": 42}}}

# Get a value
print(get(data, "a.b.c"))  # 42

# Set a value
set(data, "a.b.d", 100)
print(data)  # {'a': {'b': {'c': 42, 'd': 100}}}

# Check existence
print(has(data, "a.b.c"))  # True

# Delete a value
delete(data, "a.b.c")
print(has(data, "a.b.c"))  # False

Working with lists

data = {"items": [1, 2, 3]}

# Push a value to a list
push(data, "items", 4)
print(get(data, "items"))  # [1, 2, 3, 4]

# Pull a value by value
pull(data, "items", value=2)
print(get(data, "items"))  # [1, 3, 4]

# Pull a value by index
pull(data, "items", index=0)
print(get(data, "items"))  # [3, 4]

Using index prefix

data = {}

# Use "@" as prefix
set(data, "a.b.@0.items", [1, 2, 3], index_prefix="@")
push(data, "a.b.@0.items", 4, index_prefix="@")
print(get(data, "a.b.@0.items", index_prefix="@"))  # [1, 2, 3, 4]

# Use multi-character prefix "idx_"
set(data, "x.y.idx_0.list", [10, 20], index_prefix="idx_")
pull(data, "x.y.idx_0.list", value=10, index_prefix="idx_")
print(get(data, "x.y.idx_0.list", index_prefix="idx_"))  # [20]

Mixed usage

data = {"a": [{"b": [1, 2, 3]}]}

# Numeric keys work without prefix
print(get(data, "a.0.b"))  # [1, 2, 3]

# Push to nested list
push(data, "a.0.b", 4)
print(get(data, "a.0.b"))  # [1, 2, 3, 4]

API

Function Description Parameters
get(obj, path, default=None, index_prefix=None, query=None) Get nested value obj: dict/list, path: str/list[str], default: any, index_prefix: str or None, query: dict or None
set(obj, path, value, index_prefix=None) Set nested value obj: dict/list, path: str/list[str], value: any, index_prefix: str or None
delete(obj, path, index_prefix=None) Delete nested value obj: dict/list, path: str/list[str], index_prefix: str or None
unset(obj, path, index_prefix=None) Alias for Delete obj: dict/list, path: str/list[str], index_prefix: str or None
has(obj, path, index_prefix=None) Check if nested value exists obj: dict/list, path: str/list[str], index_prefix: str or None
push(obj, path, value, index_prefix=None) Append value to nested list obj: dict/list, path: str/list[str], value: any, index_prefix: str or None
pull(obj, path, value=None, index=None, index_prefix=None) Remove value from nested list by value or index obj: dict/list, path: str[str], value: any, index: int, index_prefix: str or None

Notes

Dot-separated paths are used for nested keys, e.g., "a.b.c" or "x.y.0.z".

Index prefixes allow you to distinguish numeric dictionary keys from list indices.

When index_prefix=None (default), any key that is a valid integer string is treated as a list index automatically.

Where path is a list the functions return a list or where its an editing functions (e.g. set, pull, push) the effect is applied to the paths one after the other.

When using the pull function, when value is a dict it is used as a query.

License

MIT License

Author

Created by Giles Tetteh. Inspired by JavaScript nested-property library.

Project details


Download files

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

Source Distribution

nested_property-1.1.3.tar.gz (6.0 kB view details)

Uploaded Source

Built Distribution

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

nested_property-1.1.3-py3-none-any.whl (6.1 kB view details)

Uploaded Python 3

File details

Details for the file nested_property-1.1.3.tar.gz.

File metadata

  • Download URL: nested_property-1.1.3.tar.gz
  • Upload date:
  • Size: 6.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.10.13

File hashes

Hashes for nested_property-1.1.3.tar.gz
Algorithm Hash digest
SHA256 d23ce9eeb9d322fc317ff0092ed2306ef3c88ff9f50923970285d1988d943483
MD5 f24f661c8808b580c033891167b4583f
BLAKE2b-256 39550c005fcf54ed90b9d2b8c890c77c4e5458c9409e82eb33ed66a49b6e5fac

See more details on using hashes here.

File details

Details for the file nested_property-1.1.3-py3-none-any.whl.

File metadata

File hashes

Hashes for nested_property-1.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 3ddff8fef0625ef07ecd899a7010d188117de2d310b95a50618dcfaf1068109f
MD5 0e832cbcaa7e350d918628aeaf9278cc
BLAKE2b-256 9ae593030589620758bda3c778ed820f8ea342fe7f5e3519b286899115cfc151

See more details on using hashes here.

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